面试被虐系列_算法分析篇_二叉树
2017-03-20 17:37
387 查看
题目:构建一个二叉树,并给定一个二叉树根节点Node,请写出函数计算出二叉树的深度,叶子节点。(兼论二叉树的不同遍历方式)
思考:
在数据结构中,树是一类非常重要的结构,很多底层非常重要的基础算法都是建立在树的基础上的。数据库索引的B-tree结构存储,路由搜索引擎的搜索算法,文件系统等等。二叉树又是树中一种非常重要,又应用广泛的结构。这里重点阐述二叉树的一个相关算法,以后如果有机会再深入聊聊树相关的其他方面。
这里遇到的一个很典型的问题,就是计算二叉树的深度和叶子节点数。这里我使用几种常用的语言进行实现,同时也简单聊聊二叉树的几种不同遍历方式。结果参考网络上一些前辈的文字,以及结合个人面试过程中的一些细节。欢迎大家吐槽,交流心得。
C#实现树深度和叶子节点计算:
JAVA实现树深度和叶子节点计算:
思考:
在数据结构中,树是一类非常重要的结构,很多底层非常重要的基础算法都是建立在树的基础上的。数据库索引的B-tree结构存储,路由搜索引擎的搜索算法,文件系统等等。二叉树又是树中一种非常重要,又应用广泛的结构。这里重点阐述二叉树的一个相关算法,以后如果有机会再深入聊聊树相关的其他方面。
这里遇到的一个很典型的问题,就是计算二叉树的深度和叶子节点数。这里我使用几种常用的语言进行实现,同时也简单聊聊二叉树的几种不同遍历方式。结果参考网络上一些前辈的文字,以及结合个人面试过程中的一些细节。欢迎大家吐槽,交流心得。
C#实现树深度和叶子节点计算:
/***** 递归计算二叉树的深度和叶子节点数 *****/ public class TreeNodeHelper { public static Node CreateTree() { Node root = new Node(); root.data = 9; Node temp01 = new Node(); temp01.data = 1; root.left = temp01; Node temp02 = new Node(); temp02.data = 3; root.right = temp02; Node temp03 = new Node(); temp03.data = 2; root.left.left = temp03; Node temp04 = new Node(); temp04.data = 4; root.left.right = temp04; return root; } // 叶子数 public static int leafNum(Node node) { if (node != null) { if (node.left == null && node.right == null) { return 1; } return leafNum(node.left) + leafNum(node.right); } return 0; } // 求二叉树的深度 public static int deep(Node node) { int h1, h2; if (node == null) { return 0; } else { h1 = deep(node.left); h2 = deep(node.right); return (h1 < h2) ? h2 + 1 : h1 + 1; } } // 中序遍历 左子树->根节点->右子树 public static void SelectTreeIn(Node root) { if (root == null) return; SelectTreeIn(root.left); Console.WriteLine(root.data + " "); SelectTreeIn(root.right); } // 先序遍历 根节点->左子树->右子树 public static void SelectTreePre(Node root) { if (root == null) return; Console.WriteLine(root.data + " "); SelectTreePre(root.left); SelectTreePre(root.right); } // 后序遍历 左子树->右子树->根节点 public static void SelectTreePost(Node root) { if (root == null) return; SelectTreePost(root.left); SelectTreePost(root.right); Console.WriteLine(root.data + " "); } // public class Node { bool visited = false; public int data = 0; public Node left = null; public Node right = null; }
JAVA实现树深度和叶子节点计算:
public class TreeNodeHelper { public static Node CreateTree() { Node root = new Node(); root.data = 9; Node temp01 = new Node(); temp01.data = 1; root.left = temp01; Node temp02 = new Node(); temp02.data = 3; root.right = temp02; Node temp03 = new Node(); temp03.data = 2; root.left.left = temp03; Node temp04 = new Node(); temp04.data = 4; root.left.right = temp04; return root; } // 叶子数 public static int leafNum(Node node) { if (node != null) { if (node.left == null && node.right == null) { return 1; } return leafNum(node.left) + leafNum(node.right); } return 0; } // 求二叉树的深度 public static int deep(Node node) { int h1, h2; if (node == null) { return 0; } else { h1 = deep(node.left); h2 = deep(node.right); return (h1 < h2) ? h2 + 1 : h1 + 1; } } // 中序遍历 左子树->根节点->右子树 public static void SelectTreeIn(Node root) { if (root == null) return; SelectTreeIn(root.left); System.out.printf(root.data + " "); SelectTreeIn(root.right); } // 先序遍历 根节点->左子树->右子树 public static void SelectTreePre(Node root) { if (root == null) return; System.out.printf(root.data + " "); SelectTreePre(root.left); SelectTreePre(root.right); } // 后序遍历 左子树->右子树->根节点 public static void SelectTreePost(Node root) { if (root == null) return; SelectTreePost(root.left); SelectTreePost(root.right); System.out.printf(root.data + " "); } // public class Node { boolean visited = false; int data = 0; Node left = null; Node right = null; }
相关文章推荐
- 面试被虐系列_算法分析篇_排序算法
- C/C++面试之算法系列--从"反转32 位数"算法题分析面试策略
- 【面试算法系列】已知二叉树的前序和中序遍历重建二叉树 - C语言实现
- C/C++面试之算法系列--二维动态数组定义及二维静态数组与**P的区别
- C/C++面试之算法系列--时间复杂度为o(N)查找1至N-1构成的a[N]重复元素
- C/C++面试之算法系列--如何实现用更少的空间表示英文字母(a ~ z)构成char A[n]字符串
- C/C++面试之算法系列--atoi(char *str)将字符串转换成整数
- C/C++面试之算法系列--以单词为最小单位翻转字符串
- C/C++面试之算法系列--一次遍历找链表倒数第n个节点
- C/C++面试之算法系列--几个典型的内存拷贝及字符串函数实现
- 数据结构与算法(C#实现)系列---二叉树
- [系列][编译原理]LR(0)分析算法的定义
- (codes)二叉树的系列算法,递归与非递归
- C/C++面试之算法系列--借刀杀人,不使用任何中间变量实现strlen
- C/C++面试之算法系列--N!的尾部连续0的个数
- C/C++面试之算法系列--去除数组中的重复数字
- C/C++面试之算法系列--从“整数转换成字符串”看算法的联想
- C/C++面试之算法系列--菲波拉契数列的递归与非递归算法
- C/C++面试之算法系列--典型的几个链表操作-逆序和重排
- C/C++面试之算法系列--几个最大子字符串的算法题