
二叉树
文章平均质量分 76
beiyeqingteng
这个作者很懒,什么都没留下…
展开
-
Closest node to the target in BST
Question:Give a BST, find a node whose value is closest to the target.public static int closestValue(Node root, int value, int maxDiff) { if (root == null) return Integer.MAX_VALUE; int tempDiff原创 2012-12-21 00:50:43 · 2151 阅读 · 0 评论 -
判断一个树是不是二叉查询树 (ISBST)
问题:给定一个二叉树,判断它是否是二叉查询树。思路:要判断是否是二叉查询树,标准就是看每一个节点是否满足:1、左节点及以下节点的值比它小;2、右节点及以下节点的值比它大。当然,前提是子节点都存在的情况。所以,我们需要从根节点不断向下递归,只要所有节点都满足,那么就是BST,否则,就不是。代码:private boolean isBST(Node node) {原创 2011-12-10 14:52:28 · 2751 阅读 · 0 评论 -
找出二叉查找树中第n大的值
问题:给一个二叉查找树(BST),找出第 k 大的值。比如:该图中,第3大的值是10.分析:我们可以通过类似中序遍历的方法把BST从大到小排序,然后,就可以得到第 k 大的值了。代码如下:public class NthNode { // k refers to the counter. it is a global variable. static int原创 2012-04-22 03:53:22 · 6894 阅读 · 4 评论 -
check whether two binary trees are identical
Question:Given two binary trees, check whether they are identical or not.Analyze:we first compare the roots of these two trees, if they are the same, we continue to compare the root of the原创 2012-09-30 21:39:37 · 987 阅读 · 0 评论 -
二叉查询树的保存和读取(Serialization/Deserialization)
问题:把一个二叉查询树保存到一个文件,然后通过这个文件把这个二叉查询树还原出来。我们使用pre-order遍历把一个二叉查询树保存,原因是只有pre-order遍历是从root开始保存,这样,当我们读取的时候,才能够把那个值放在root。这里我用print来表示保存。public void preOrderWrite(Node root) { if (root!= null) {原创 2011-09-13 06:40:25 · 1235 阅读 · 0 评论 -
分层打印二叉树 [N0. 20]
问题:把一个二叉树,安装从root到leaf的顺序把每一层上的node从左到右打印出来。分析:利用两个arraylist,一个arraylist装上一层的node, 另一个arraylist装上一层的child。如果上一层arraylist空了,两个arraylist互换。代码://print the binary tree by levelpublic static原创 2011-09-04 05:14:48 · 1415 阅读 · 0 评论 -
打印二叉树的边缘节点
问题:给你一个complete 二叉树,逆时针打印所有边缘节点, 比如:那么,逆时针打印边缘节点后,输出:1 , 3, 5, 9, 8, 6 .分析:如果想写一个方法实现这个要求是很难的,但是,我们可以考虑分步实现。第一步:打印左边的边缘节点;第二步:打印底部所有节点;第三步:打印右边所有边缘节点。代码如下:public stati原创 2012-07-01 01:06:12 · 2341 阅读 · 0 评论 -
二叉查找树(Binary Search Tree)
二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。二叉查找树的表示:class Node { int data; Node leftChild =原创 2011-08-05 03:32:09 · 2073 阅读 · 1 评论 -
二叉查询树三种遍历的非递归写法 [No. 78]
这里写出三种儿叉查询树遍历的非递归写法,非常有意思。preorder:先打印root,再left,最后right。 public static void BSTPreorderTraverse(Node node) { if (node == null) { return; } Stack s = new Stack(); s.原创 2011-08-28 03:11:41 · 1271 阅读 · 0 评论 -
给定一个二叉树,从左到右,找出第 k 个叶子节点 [# 65]
问题:给定一个二叉树,从左到右,找出第 k 个叶子节点。比如图中二叉树的第 3 个叶子节点(从左到右)是 11.分析:因为顺序是从左往右数,所以,对于一个节点下的两个叶子节点来讲(比如 6 下面有两个叶子节点 5 和 11),我们要确保先遍历最左边一个,然后再遍历右边一个。这样,其实,在中序遍历,前序遍历和后序遍历中,都能保证左边叶子节点比右边叶子节点先被遍历。我们只需要对原创 2012-04-22 04:15:01 · 3069 阅读 · 0 评论 -
把一个排好序的数组数组转化成一颗平衡二叉查询树 [No. 79]
Solution:If you would have to choose an array element to be the root of a balanced BST, which element would you pick? The root of a balanced BST should be the middle element from the sorted array.转载 2011-08-09 12:16:43 · 2179 阅读 · 0 评论 -
The diameter of a binary tree [No. 40]
Definition: The diameter of a tree (sometimes called the width) is the number of nodes on the longest path between two leaves in the tree.The diameter of a tree T is the largest of the following qua原创 2011-08-16 05:08:12 · 1401 阅读 · 0 评论 -
最近公共祖先 (LCA) [No. 21]
问题:给定一个二叉树,找到两个节点NA, NB的最近公共祖先(LCA)。比如对于下图,4 和 7 的 LCA 是6, 1和13的LCA 是 8。我们这里先考虑一般的二叉树(BT),然后再考虑这个二叉树是二叉搜索树(BST)的情况。查找两个node的最早的公共祖先,分三种情况:1. 如果两个node在root的两边,那么最早的公共祖先就是root。2.原创 2011-12-10 01:57:50 · 2885 阅读 · 0 评论 -
打印二叉树所有的路径 [No. 9]
问题:给一个二叉树,把所有的路径都打印出来。比如,对于下面这个二叉树,它所有的路径为:8 -> 3 -> 18 -> 2 -> 6 -> 48 -> 3 -> 6 -> 78 -> 10 -> 14 -> 13思路:从根节点开始,把自己的值放在一个数组里,然后把这个数组传给它的子节点,子节点同样把自己的值放在这个数组里,又传给自己的子节点,直到这个节点是叶节点,原创 2011-12-11 03:39:20 · 4758 阅读 · 1 评论 -
检查一个数组是否可能是一棵二叉查询树后序遍历的结果 [No. 6]
问题:给一个数组,检查它是否可能是一棵二叉查询树后序遍历的结果。换句话说,是否存在一棵二叉查询树,对它进行后序遍历后,得到的数组和给定的数组完全一样。比如,对上面这个二叉查询树后序遍历后,得到的数组是:[1, 4, 7, 6, 3, 13, 14, 10, 8]。思路:因为二叉树后序遍历的时候,先左后右然后中间。所以,数组的最后一个一定是整个二叉查询树的根(比如 8),而且原创 2011-12-14 13:39:39 · 1476 阅读 · 0 评论 -
不使用栈把二叉树中序输出
问题:把一个二叉树中序输出,但是不能使用栈或者O(n)空间来实现。分析:把二叉树中序输出,我们可以使用递归或者采用非递归方式,但是不管是哪种方式,我们总是需要O(n)的空间,所以如果只能使用常数空间,的确很难想到,但是一旦掌握该种方法,还是挺有用的,至少拓宽了自己解决问题的思路。对于中序遍历,我们总是先输出左子树部分,再root,最后才是右子树部分。对于左子树和右子原创 2015-08-13 00:07:59 · 1946 阅读 · 0 评论