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

第六十九课 二叉树的线索化实现

时间:2018-09-24 16:58:38      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:先序   btree   idt   alt   length   图片   先序遍历   效率   需要   

技术分享图片

 

 

在工程中,很多时候二叉树一旦建立就不会轻易改动,这样的二叉树就用于遍历,我们讲了先序遍历、中序遍历、后续遍历三种方式,都是递归完成的,在工程中,如果对一棵二叉树反复的执行遍历,效率很低,递归的效率是比较低的。

改进的做法就是将遍历的结果保存下来,下一次遍历时直接用这个结果。

在工程中另一种需求就是,在中序遍历下,需要知道某一个节点的前驱是谁,后继是谁,需要这三个节点来判断是否执行后续的操作。这个时候又需要遍历了。每次都递归的进行遍历,效率太低了。

为了效率,我们使用线索化二叉树的方法,将二叉树转换为一个线性结构,这样效率就高了。

技术分享图片

 

 技术分享图片

 

技术分享图片

 

技术分享图片

 

 技术分享图片

 

初始准备两个队列,tmp队列用于层次遍历,出队的时候将元素放到queue中,queue队列负责线索化。

新添加层次遍历函数的流程如下:

技术分享图片

 

 添加层次遍历函数:

 1 void levelOrderTraversal(BTreeNode<T>* node, LinkQueue<BTreeNode<T>*>& queue)
 2     {
 3         if( node != NULL )
 4         {
 5             LinkQueue<BTreeNode<T>*> tmp;
 6 
 7             tmp.add(node);
 8 
 9             while( tmp.length() > 0 )
10             {
11                 BTreeNode<T>* n = tmp.front();
12 
13                 if( n->left != NULL )
14                 {
15                     tmp.add(n->left);
16                 }
17 
18                 if( n->right != NULL )
19                 {
20                     tmp.add(n->right);
21                 }
22 
23                 tmp.remove();
24                 queue.add(n);
25             }
26         }
27     }

 

第六十九课 二叉树的线索化实现

标签:先序   btree   idt   alt   length   图片   先序遍历   效率   需要   

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9695438.html

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