二叉树遍历的递归算法和非递归算法我们当然应该很熟悉了,不过还有另外一种遍
历方式,就是增加了树的构造,然后不允许递归或是用到栈进行遍历,如线索树或者是
有父母节点的二叉树等等等等。这样的遍历就需要我们找到一个节点的后继,同样如果
有更变态的题要求我们找一个节点的前驱,也和找后继是一个类型,下面我就关于三种
遍历方法的前驱和后继作一讨论和总结,让大家在考试的时候得心应手。也请高手给与
指正
一、前序遍历
找后继:
1、若有左子女,则后继是左子女;
2、若无左子女,有右子女,则后继是右子女;
3、若既无左子女,又无右子女,则是一片叶子;再讨论:
a若是其父母的左子女,且父母有右子女,则后继是父母的右子女。
b若是其父母的左子女,且父母无右子女;
c若是其父母的右子女。
b,c都表示这是某个节点的左子树前序遍历的最后一个节点,则需要找第一
个有 右子树的“左祖先”(这个是我自己定义,即找第一个使得当前节点在这
个祖先的左 子树上),然后后继就是这个祖先的右子女。
如何找这个左祖先?即
while((p->parent->rchild==NULL||p->parent->rchild==p)&&p!=NULL)
p=p->parent;
if(!p)表示已经全部遍历完毕。结束;else p=p->lchild;下一个节点
找前驱
1、若是父母的左孩子,则前驱是父母;
2、若是父母的右孩子,且父母无左子树,则前驱是父母;
3、若是父母的右孩子,父母有左子树,则前驱是父母左子树的最后访问到的节点
(指 向父母的左子树后,一直往右,若不行的话,往左一步,一直到叶子)
二、中序遍历
找后继
1、如有右子女,后继是右子女的最左下节点;
2、若无右子女,且是父母的左子女,则后继就是父母;
3、若无右子女,且是父母的右子女,则一直上溯到第一个“左祖先”(定义如前
面)则 后继就是这个祖先。若无这样的祖先,说明已经遍历完毕。
找前驱
1、如有左子女,前驱是左子女的最右下节点;
2、若无左子女,且是父母的右子女,则前驱就是父母;
3、若无左子女,且是父母的左子女,则一直上溯到第一个“右祖先”(定义如前
面)则 前驱就是这个祖先。若无这样的祖先,说明已经遍历完毕。
三、后序遍历
找后继
1、若是父母的右孩子,则后继是父母;
2、若是父母的左孩子,且父母无右子树,则后继是父母;
3、若是父母的左孩子,父母有右子树,则后继是父母右子树的最先访问到的节点
(指 向父母的右子树后,一直往左,若不行的话,往右一步,一直到叶子)
找前驱:
1、若有右子女,则前驱是右子女;
2、若无右子女,有左子女,则前驱是左子女;
3、若既无左子女,又无右子女,则是一片叶子;再讨论:
a若是其父母的右子女,且父母有左子女,则前驱是父母的左子女。
b若是其父母的右子女,且父母无左子女;
c若是其父母的左子女。
b,c都表示这是某个节点的右子树后序遍历的第一个节点,则需要找第一个
有 左子树的“右祖先”,然后前驱就是这个祖先的左子女。
其实前序遍历是“左右根”,中序遍历是“左根右”,后序是“左右根”,我们可
以看出,前序找后继和后序找前驱是对偶的(只要把左换成右,前驱换成后继,第一访
问换成最后访问即可),同样前序找前驱和后序找后继,中序找前驱和中序找后继都是
对偶的,这样记忆起来就非常方便了~~~~~
分享到:
相关推荐
二叉树遍历是计算机科学中处理树结构数据时常用的一种技术,主要分为前序遍历、中序遍历和后序遍历三种方式。...在实际编程中,可以利用这些规则实现非递归的二叉树遍历,例如通过线索二叉树或者栈来辅助实现。
二叉树遍历序列.cpp
在每个节点上增加一个指向其前驱或后继节点的指针,可以使得遍历过程更高效。对于二叉搜索树,中序穿线后,通过链表的方式可以快速地进行中序遍历,而不需要额外的栈或递归操作。 在C++中实现二叉树的中序穿线,...
中序线索二叉树是为二叉树的每个节点增加了两个线索,用于指示其在中序遍历中的前驱和后继节点。这样,即使在非递归遍历时也可以方便地进行中序遍历。在构造线索二叉树时,需要遍历整个树,对每个节点进行线索化处理...
总结来说,中序线索化二叉树是为了解决非递归中序遍历的问题,通过在二叉树的节点中添加线索,使得在遍历时可以直接找到前驱和后继节点。这种技术提高了遍历效率,尤其在处理大规模数据时更为明显。理解并掌握中序...
### 数据结构之二叉树遍历与子树交换实验报告知识点总结 #### 一、实验背景及目的 本次实验旨在通过编程实现二叉树的各种遍历算法及其子树交换功能,帮助学生深入理解二叉树的基本概念和遍历算法的工作原理。通过...
在实际应用中,二叉树遍历常用于各种问题的解决,如搜索、排序、表达式求值等。例如,在人事管理系统的二叉树中,如果需要提高所有员工的工资20%,可以通过遍历每个节点并更新其工资信息来实现;若要打印所有员工的...
根据提供的标题“【课件】5.3.2_3在线索二叉树中找前驱后继.pdf”以及描述“【课件】5.3.2_3在线索二叉树中找前驱后继”,我们可以推断出这份课件主要讲解的是如何在一种特殊的数据结构——线索二叉树中寻找节点的...
在提供的文件中,`Tree.cpp`可能包含了二叉树遍历和线索化的C++实现,而`Tree.dsw`和`Tree.h`则可能是项目工程文件和头文件,其中可能包含了二叉树结构的定义和相关函数声明。通过阅读这些代码,可以更深入地理解...
二叉树遍历是计算机科学中处理二叉树数据结构的一种基本操作,它涉及按照特定顺序访问二叉树的所有节点。二叉树是由节点组成的,每个节点最多有两个子节点,通常分为左子节点和右子节点。二叉树的遍历方法主要有三种...
中序遍历是二叉树遍历的一种方法,通常用于处理有序数据,如排序或查找操作。中序线索化是将非线索二叉树转化为线索二叉树的过程,目的是为了方便在不使用栈的情况下进行中序遍历,特别是在查找某个结点的前驱和后继...
同时,线索二叉树提供了一种有效的数据结构方式来处理二叉树遍历中可能出现的空指针问题,并且能够更加高效地实现中序遍历。在实际应用中,线索二叉树非常适合需要频繁遍历的场景,比如在文本编辑器中实现光标移动、...
本节内容主要介绍了数据结构中的树和二叉树,特别是关于遍历二叉树和线索二叉树的概念及算法。首先,树是一种非线性的数据结构,由根节点、左子树和右子树组成。二叉树是特殊的树,每个节点最多有两个子节点,分为左...
* 掌握线索化二叉树及寻找某结点的前驱和后继的方法 * 掌握树与森林的实现和遍历方法 * 掌握二叉排序树的建立与中序遍历的算法实现 * 建立一棵二叉树并分别用先根、中根、后根遍历的算法 * 建立一棵线索二叉树并寻找...
中序遍历是二叉树遍历的一种方法,它按照“左-根-右”的顺序访问节点。对于非递归实现,通常使用栈来辅助完成。首先遍历左子树直到到达叶子节点,然后访问当前节点,最后遍历右子树。这个过程可以确保按照正确的顺序...
线索二叉树是一种特殊形式的二叉链表,它在每个节点中增加了两个额外的指针,分别指向其前驱和后继节点,从而在非递归情况下也能方便地进行中序遍历。线索二叉树的实现可以显著提高某些操作的效率,特别是当需要频繁...
### Java基础复习笔记08数据结构-二叉树和二叉树的遍历 #### 一、二叉树概述 二叉树(Binary Tree)是一种重要的数据结构,在计算机科学中有广泛的应用。二叉树中的每个节点最多有两个子节点,分别称为左子节点和右...
这样,通过线索二叉树,我们可以在不改变原有二叉树结构的前提下,快速定位到节点的前驱和后继,从而实现非递归的遍历算法。 1. **线索二叉树的构建**: - 在构造线索二叉树时,首先需要确定遍历的顺序,如中序...
总之,线索二叉树是一种增强二叉树遍历能力的数据结构,通过在节点中添加线索指针,使得非递归遍历成为可能,尤其在处理反向遍历时更为高效。C语言作为一种底层语言,非常适合实现这样的数据结构,通过结构体和指针...
3. 节点有两个子节点,需要找到其直接前驱或后继节点来替代,并从树中删除原节点。 在实际的C++代码中,`CreateTree`函数用于创建二叉树,`Preorder`、`Inorder`和`Postorder`分别用于先序、中序和后序遍历。删除...