码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树相关

时间:2018-07-01 17:49:23      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:超过   返回   否则   记录   代码   先序   左右子树   左右   高度   

中序遍历非递归逻辑

当前节点为空,打印,从栈中弹出,访问右子树

当前节点不空,入栈,继续访问左子树。

后续遍历非递归写法 很简单的思路。借助于两个栈的结构来实现。

中左右---> 中右左----->左右中

如何直观打印一颗二叉树?这个在调试的时候是很有用的。

一个节点的后继节点应该怎么找?是中序遍历中的后面的位置。

如果一个节点有右子树,后继节点就是右子树上边最左边的节点。

如果一个节点没有右子树,就是要知道,这个节点是作为那个节点左子树的最后一个节点

通过父指针找到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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!