数据结构
GJYSM1987
这个作者很懒,什么都没留下…
展开
-
二叉树两个结点的最低公共祖先
问题:求一个普通二叉树中两个节点的公共祖先。解决办法基于先序遍历,需要一个辅助栈存储两个节点的所有公共祖先。函数传入的两个节点参数为节点值,也可根据需要改为节点指针(需要预先判断是否为空),不影响整个过程。结果会包括以下特殊情况:(1)给出的二叉树为空;(2)给出的两个节点至少有一个不在二叉树中;(3)其中一个节点为另一个节点的孩子节点,此时公共祖先为后者的父节点;(4)两个节原创 2013-08-14 23:13:27 · 521 阅读 · 0 评论 -
《编程之美》——求二叉树中节点的最大距离(非递归)
这里给出书中扩展问题提出的非递归解法。就像书中总结的时候给出的叶先生博客中关于本题的解法,这里同样不需要在节点中嵌入nMaxLeft、nMaxRight等额外数据。主要原理是基于非递归后续遍历二叉树。额外需要两个栈:一个用于遍历二叉树,另一个用于临时存储以当前节点为根节点的子树的最大深度。当然也可以采取改变结点值来存储最大深度,不过这样虽然简单但并不实用。下面是代码请您感受下:原创 2013-08-14 16:48:37 · 680 阅读 · 0 评论 -
根据先序和中序遍历重建二叉树
思路: 关键在每次读取两个数组的范围问题:in(中序遍历数组)的边界比较好确定:有左子树时为[start2,i-1]; 有右子树时为[i+1,end2]pre(先序遍历数组)的边界要根据in确定:有左子树时根据aft和i求出左子树节点个数为:i-start2。所以pre的边界就要包括接下来的i-start2个节点,即:从start1+1到start1+(i-start2)此原创 2013-09-04 10:04:43 · 489 阅读 · 0 评论 -
根据后序和中序遍历重建二叉树
思路:与已知前序遍历的区别在于后序序列要从后向前的顺序建立。因为前序遍历根节点在其所有子树的前面,而后序遍历的根节点在其所有字数的后面。关键在边界问题:1) in的边界比较好确定: 有左子树时为[start2,i-1];有右子树时为[i+1,end2]2) aft的边界要根据aft确定: 有左子树时根据aft和i求出左子树节点个数为:i-start2。所以pre的边界就原创 2013-09-04 01:18:18 · 593 阅读 · 0 评论