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

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

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

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

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

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

第六十九课 二叉树的线索化实现的相关文章

第六十五课 二叉树中属性操作的实现

递归功能函数: 1 int count(BTreeNode<T>* node) const 2 { 3 return (node != NULL) ? (count(node->left) + count(node->right) + 1) : 0; 4 } 功能函数如下: 1 int height(BTreeNode<T>* node) const 2 { 3 int ret = 0; 4 5 if( node != NULL ) 6 { 7 int lh = hei

第六十四课 二叉树中结点的删除与清除

BTree.h中添加删除操作: 1 #ifndef BTREE_H 2 #define BTREE_H 3 4 #include "Tree.h" 5 #include "BTreeNode.h" 6 #include "Exception.h" 7 #include "LinkQueue.h" 8 9 namespace DTLib 10 { 11 12 template < typename T > 13 cl

第十九课预习任务

第十九课预习任务 11.25 配置防盗链11.26 访问控制Directory11.27 访问控制FilesMatch11.28 限定某个目录禁止解析php11.29 限制user_agent11.30/11.31 php相关配置11.32 php扩展模块装安扩展几种限制ip的方法 http://ask.apelearn.com/question/6519apache 自定义header http://ask.apelearn.com/question/830apache的keepalive和k

NeHe OpenGL教程 第二十九课:Blt函数

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第二十九课:Blt函数 Blitter 函数: 类似于DirectDraw的blit函数,过时的技术,我们有实现了它.它非常的简单,就是把一块纹理贴到另一块纹理上. 这篇文章是有Andreas Lffler所写的,它写了一份原始的教

NeHe OpenGL教程 第三十九课:物理模拟

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十九课:物理模拟 物理模拟简介: 还记得高中的物理吧,直线运动,自由落体运动,弹簧.在这一课里,我们将创造这一切. 物理模拟介绍 如果你很熟悉物理规律,并且想实现它,这篇文章很适合你. 在这篇教程里,你会创建一个非常简单的物理引

KALI LINUX WEB 渗透测试视频教程—第十九课-METASPLOIT基础

原文链接:Kali Linux Web渗透测试视频教程—第十九课-metasploit基础 文/玄魂 目录 Kali Linux Web 渗透测试视频教程—第十九课-metasploit基础...................... 1 metasploit..................................................................................................... 1 基本体系结构..........

六十九、for循环、while循环、break跳出循环、continue结束本次循环、exit退出整

六十九.for循环.while循环.break跳出循环.continue结束本次循环.exit退出整个脚本 一.for循环 语法:for 变量名 in 条件; do -; done 案例1 # vim for1.sh #!/bin/bash sum=0 for i in `seq 1 100` do sum=$[$sum+$i]     //核心语句 echo $i done echo $sum //最后再echo $sum,不能在for循环里echo,不然每次的sum都打印出来了.让它每次都打

二叉树的线索化算法思想详解

二叉树的线索化,这几天以来我很难掌握,今天终于想通了,哈哈,首先我们来看看二叉树线索化之后会变成什么样子,这里我们以图中的二叉树为例,图如下: 画的太糙,各位看官讲究着看吧- -.所谓二叉树的线索化,就是当一个节点的左右指针为空时,就让它的左右指针指向该节点的前驱或者后继(一般来说左指针指向前驱,右指针指向后继).这里不论指向前驱或者后继,我们都应该线索化时,至少要明确两个节点指针的值,当前节点和当前节点的前驱/后继.这也是线索化的两种思路: 保存前驱:访问当前节点时若当前节点的左指针为空,则令

二叉树及其线索化分析

1. Where did it could work? /** *    Q: Where did it could work? * *    A: Bin-tree is generally used in deal with work about search or sort. For a  balance tree, it's depth is log2(n). That's means if we want to find a  node in the tree we need *