标签:超过 返回 否则 记录 代码 先序 左右子树 左右 高度
中序遍历非递归逻辑
当前节点为空,打印,从栈中弹出,访问右子树
当前节点不空,入栈,继续访问左子树。
后续遍历非递归写法 很简单的思路。借助于两个栈的结构来实现。
中左右---> 中右左----->左右中
如何直观打印一颗二叉树?这个在调试的时候是很有用的。
一个节点的后继节点应该怎么找?是中序遍历中的后面的位置。
如果一个节点有右子树,后继节点就是右子树上边最左边的节点。
如果一个节点没有右子树,就是要知道,这个节点是作为那个节点左子树的最后一个节点
通过父指针找到parent,如果发现这个节点是这个父节点的右孩子,两个节点指针同时就继续往上,一直到当前节点是父节点的左孩子为止。如果parent为NULL了就表示该节点没有后继。
可以这样考虑,中序遍历的顺序是左中右,因此,如果一个节点有右子树,那么右子树也是按照左中右的顺序进行遍历,因此,下一个节点应该是右子树中的最左边的节点。如果一个节点没有右子树,以这个节点为根的所有子树都已经遍历过了,因此就要向上走,如过这个节点是父节点的左子树,根据左中右的顺序,后继节点就是父节点。如果这个节点是父节点的右子树,说明,父节点为根的子树已经遍历完了,要继续往上走走,直至找到当前节点是父节点的左子树,或者父节点为NULL,表明该节点是没有后继节点的。大概就是这个样子。
一个节点的前驱节点怎么找?
如果这个节点有左子树,那么就是左子树最右边的节点。
如果这个节点没有左子树,就往上找,如果这个节点是父节点右孩子就停止,如果父节点为NULL,表示没有前驱节点。和上面那个是很类似的。
二叉树序列化和反序列化 持久化
1 先序的方式来进行序列化
1_2_4_#_#_5_#_#_3_6_#_#_7_#_#_ #表示空 _表示分割
先序方式反序列化
怎么序列化的就怎么反序列化回来。
2 按层序列化。
判断一棵树是否是平衡二叉树。
树中的任何节点左子树和右子树的高度差不超过1.
判断一棵树是否是搜索二叉树,二叉树的中序遍历是升序的就是搜索二叉树,否则就不是一个搜索二叉树。保证在中序遍历中升序就可以了。
在非递归代码中,将打印这个数的时机变成比较的时机,同时记录一个节点保存上一次值的大小。
判断是否是完全二叉树。
1 如果一个节点有右子树没有左子树直接返回false
2 如果一个节点不是左右孩子双全,也就是有左子树没有右子树或者是左右子树都没有(因为没有 左子树有右子树这种情况已经过滤掉了),后面遇到的节点都必须是叶子节点,否则一定不是完全二叉树。遍历完了,满足上面两条 就是完全二叉树。
计算完全二叉树的节点个数
首先遍历左边界,求出高度, logN
遍历右子树的左边界 如果到了最后一层,说明左子树是满的。可以直接计算左子树的个数。在加上父节点,因此就是2^(l-1), 然后递归右子树,母问题和子问题等效求解。
如果没到最后一层,说明右子树是满的,同样的方式计算左子树。
标签:超过 返回 否则 记录 代码 先序 左右子树 左右 高度
原文地址:https://www.cnblogs.com/randyniu/p/9250513.html