树遍历

Posted

tags:

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

;前序遍历(DLR) ,结点可以直接输出

每个节点入栈后,直接输出找到叶子节点,回朔 右孩子在这么来一次
;中序遍历(LDR)
每个结点入栈,往左孩子方向一直找到叶子结点,回朔,输出结点内容,右孩子在来一次
;后序遍历(LRD)
每 个节点入栈,往左孩子方向一直不找到叶子节点,回朔,判断1左孩子和右孩子都等于空输出,保存输出的结点指针,2右孩子为空或者当前结点的右孩子等于上次 保存的输出结点,那么就输出,保存输出结点,当前结点置空,continue 3 如果结点还有右孩子那么pop之后应该把pop的双亲结点在push到栈中
叶子    右孩子等于空 || 右孩子输出过了 那么双亲结点可以输出了
;逆前序(DRL)(即入栈的时候先右孩子在左孩子入栈和前序先左孩子入栈然后再右孩子入栈)
;逆中序(RDL)
 
;逆后序(RLD)
 
;层遍历(使用队列)
输出结点,左孩子不为空入队列 ,右孩子不为空入队列, 从队列拿出一个结点 循环继续这个节点的
左孩子不为空入队列 ,右孩子不为空入队列
 
;后序遍历删除一个结点影响最小
左 右 中
;无序树并不能带来查询优势,所以生产中都是有序树,查询速度快O(log2n)
技术分享
 
;数组的折半查找对于这种海量数据就没用了,1没这么大的连续空间存储几十亿的数据,2每次增加一条数据就要排序,几十亿的数据怎么排...所以有序树的优势
 
;中序遍历如果输出的数据()是从小到大的有序的,可以看出这棵树是有序树
;有序树的插入
1空树直接插入
2不是空树先查找个位置,然后再插入大于放树的右边,小于放树的左边,等于暂时不搞
;删除树的结点
1如果要删除的结点是叶子节点那么直接删除 ,把双亲结点的左孩子或者右孩子的指针干掉
2如果不是叶子结点,且只有一个结点,那么直接把他删除,把它的孩子结点的parent指向 它的parent结点,它的parent结点的孩子指向原来的孙子结点
3如果不是叶子节点,且有两个孩子,
例如删除5,那么左边孩子中找出一个最大的如4,把它放上去和5对换,然后把对换后的5删除,保证了还是有序树
2右边找最大的换位
 
;删除所有
后序遍历删除所有节点

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

为啥树的后根遍历对应二叉树的中序遍历

树遍历以及图遍历的方法

树森林的遍历

[数据结构] 树森林的遍历

算法_二叉树遍历篇

二叉树遍历逻辑