二叉树相关

Posted randyniu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树相关相关的知识,希望对你有一定的参考价值。

中序遍历非递归逻辑

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

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

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

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

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

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

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

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

通过父指针找到parent,如果发现这个节点是这个父节点的右孩子,两个节点指针同时就继续往上,一直到当前节点是父节点的左孩子为止。如果parent为NULL了就表示该节点没有后继。

可以这样考虑,中序遍历的顺序是左中右,因此,如果一个节点有右子树,那么右子树也是按照左中右的顺序进行遍历,因此,下一个节点应该是右子树中的最左边的节点。如果一个节点没有右子树,以这个节点为根的所有子树都已经遍历过了,因此就要向上走,如过这个节点是父节点的左子树,根据左中右的顺序,后继节点就是父节点。如果这个节点是父节点的右子树,说明,父节点为根的子树已经遍历完了,要继续往上走走,直至找到当前节点是父节点的左子树,或者父节点为NULL,表明该节点是没有后继节点的。大概就是这个样子。

一个节点的前驱节点怎么找?

如果这个节点有左子树,那么就是左子树最右边的节点。

如果这个节点没有左子树,就往上找,如果这个节点是父节点右孩子就停止,如果父节点为NULL,表示没有前驱节点。和上面那个是很类似的。

二叉树序列化和反序列化 持久化

1  先序的方式来进行序列化

1_2_4_#_#_5_#_#_3_6_#_#_7_#_#_ #表示空 _表示分割

先序方式反序列化

怎么序列化的就怎么反序列化回来。

2  按层序列化。

判断一棵树是否是平衡二叉树。

树中的任何节点左子树和右子树的高度差不超过1.

判断一棵树是否是搜索二叉树,二叉树的中序遍历是升序的就是搜索二叉树,否则就不是一个搜索二叉树。保证在中序遍历中升序就可以了。

在非递归代码中,将打印这个数的时机变成比较的时机,同时记录一个节点保存上一次值的大小。

判断是否是完全二叉树。

1 如果一个节点有右子树没有左子树直接返回false

2 如果一个节点不是左右孩子双全,也就是有左子树没有右子树或者是左右子树都没有(因为没有 左子树有右子树这种情况已经过滤掉了),后面遇到的节点都必须是叶子节点,否则一定不是完全二叉树。遍历完了,满足上面两条 就是完全二叉树。

计算完全二叉树的节点个数

首先遍历左边界,求出高度, logN

遍历右子树的左边界 如果到了最后一层,说明左子树是满的。可以直接计算左子树的个数。在加上父节点,因此就是2^(l-1), 然后递归右子树,母问题和子问题等效求解。

                                如果没到最后一层,说明右子树是满的,同样的方式计算左子树。

 

以上是关于二叉树相关的主要内容,如果未能解决你的问题,请参考以下文章

二叉树相关概念

二叉树的相关算法

排序二叉树,平衡二叉树和红黑树的概念以及相关的操作讲解

二叉树的相关知识点

二叉树的建立以及相关操作,平衡二叉树

数据结构树相关代码(数据结构笔试复测Leecode牛客)