在工程中,很多时候二叉树一旦建立就不会轻易改动,这样的二叉树就用于遍历,我们讲了先序遍历、中序遍历、后续遍历三种方式,都是递归完成的,在工程中,如果对一棵二叉树反复的执行遍历,效率很低,递归的效率是比较低的。
改进的做法就是将遍历的结果保存下来,下一次遍历时直接用这个结果。
在工程中另一种需求就是,在中序遍历下,需要知道某一个节点的前驱是谁,后继是谁,需要这三个节点来判断是否执行后续的操作。这个时候又需要遍历了。每次都递归的进行遍历,效率太低了。
为了效率,我们使用线索化二叉树的方法,将二叉树转换为一个线性结构,这样效率就高了。
初始准备两个队列,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 }
原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9695438.html
时间: 2024-10-09 22:29:59