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

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

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

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

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

 

 

初始准备两个队列,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     }

猜你喜欢

转载自www.cnblogs.com/wanmeishenghuo/p/9695438.html