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

树遍历

时间:2016-06-05 23:01:16      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

;前序遍历(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右边找最大的换位
 
;删除所有
后序遍历删除所有节点

树遍历

标签:

原文地址:http://www.cnblogs.com/jk0011/p/5561981.html

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