`

关于二叉树遍历的前驱后继规则

阅读更多
二叉树遍历的递归算法和非递归算法我们当然应该很熟悉了,不过还有另外一种遍
历方式,就是增加了树的构造,然后不允许递归或是用到栈进行遍历,如线索树或者是
有父母节点的二叉树等等等等。这样的遍历就需要我们找到一个节点的后继,同样如果
有更变态的题要求我们找一个节点的前驱,也和找后继是一个类型,下面我就关于三种
遍历方法的前驱和后继作一讨论和总结,让大家在考试的时候得心应手。也请高手给与
指正
一、前序遍历
找后继:  
  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都表示这是某个节点的右子树后序遍历的第一个节点,则需要找第一个
有    左子树的“右祖先”,然后前驱就是这个祖先的左子女。
  其实前序遍历是“左右根”,中序遍历是“左根右”,后序是“左右根”,我们可
以看出,前序找后继和后序找前驱是对偶的(只要把左换成右,前驱换成后继,第一访
问换成最后访问即可),同样前序找前驱和后序找后继,中序找前驱和中序找后继都是
对偶的,这样记忆起来就非常方便了~~~~~
1
0
分享到:
评论
2 楼 tieye 2017-01-06  
太棒了写得
1 楼 wuxy720 2017-01-04  
写得太棒了

相关推荐

    二叉树遍历的前驱和后继规则说明

    二叉树遍历的前驱和后继规则说明,内容详细,推荐给大家。

    二叉树遍历序列.cpp

    二叉树遍历序列.cpp

    C语言数据结构之线索二叉树及其遍历

    传统的链式结构只能体现一种父子关系,¥不能直接得到节点在遍历中的前驱和后继¥,而我们知道二叉链表表示的二叉树中有大量的空指针,当使用这些空的指针存放指向节点的前驱和后继的指针时,则可以更加方便的运用...

    线索二叉树

    通过前序序列创建线索二叉树 1:中序遍历 2:查找节点前驱后继 3:插入节点 4:删除节点 0:退出

    第五章 树与二叉树

    (2)若bt=NULL,则表明以bt为根指针的二叉树遍历完毕,并且bt是栈顶指针所指结点的左子树,若栈不空,则应根据栈顶指针所指结点找到待遍历右子树的根指针并赋予bt,以继续遍历下去;若栈空,则表明整个二叉树遍历...

    一个关于线索二叉树的课设报告

    1. 输入形式及输入值...3. 若二叉树建立成功,则该程序最后输出一个字符串,并可以查找任意字符的前驱和后继,将它们输出。 4. 测试数据 输入:ab&&c&& 输出:bac 请输入要查找的结点:a a的前驱为:b,后继为:c

    查找二叉树的c语言实现

    c语实现了查找二叉树的建立,插入删除,遍历,前驱,后继等相关操作

    lab09 11.doc

    题目要求:由先序遍历序列建立二叉树的二叉链表,中序线索化二叉树并找出结点的前驱和后继。 步骤一:新建工程,新建一个头文件,命名为 thread.h,一个源文件命名为thread.cpp 步骤二: 在thread.h中编辑代码,...

    Java线索化二叉树数据结构.docx

    利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索") 这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据...

    第六章 树和二叉树作业及答案(100分).docx

    方便查找某结点的前驱或后继 B. 方便二叉树的插入与删除 C. 方便查找某结点的双亲 D. 使二叉树的遍历结果唯一 7. 有abc三个结点的右单枝二叉树的顺序存储结构应该用( )示意。 A. a b c B. a b ^ c C. a b ...

    python二叉树的实现实例

    树结构的特点是:它的每一个结点都可以有不止一个直接后继,除根结点外的所有结点都有且只有一个直接前驱。树的递归定义如下:(1)至少有一个结点(称为根)(2)其它是互不相交的子树二叉树: 二叉树是由n(n≥0...

    二叉树节点ADT接口(Java算法源码)

    //按照中序遍历的次序,找到当前节点的直接前驱 public BinTreePosition getPrev(); //按照中序遍历的次序,找到当前节点的直接后继 public BinTreePosition getSucc(); //断绝当前节点与其父亲的父子关系 //...

    c++建立二叉链表树以及哈夫曼树

    理解二叉树线索化的实质是建立结点与其在相应序列中的前驱或后继之间的直接联系。二叉树的线索化过程是基于对二叉树进行遍历,而线索二叉树上的线索又为相应的遍历提供了方便

    基于链表节点实现二叉树节点(Java源码)

    * 基于链表节点实现二叉树节点 */ package dsa; public class BinTreeNode implements BinTreePosition { protected Object element;//该节点中存放的对象 protected BinTreePosition parent;//父亲 ...

    leetcode145-Algorithm:数据结构与算法学习

    二叉树遍历:先序/中序/后序/层序 递归/非递归 二叉树序列化与反序列化 二叉树打印 AVL树实现及相关算法 红黑树实现(TODO) 求中序遍历某节点的前驱和后继节点 堆 最大堆实现 最小堆实现 排序算法 冒泡排序 选择...

    数据结构和算法动画演示

    寻找中序线索化二叉树指定结点的前驱 寻找中序线索化二叉树指定结点的后继 构造哈夫曼树的算法模拟 构造哈夫曼树过程 树、森林和二叉树的转换 开放定址法建立散列表 拉链法创建散列表 朴素串匹配算法过程示意 图的...

    平衡二叉树

    cout输入平衡二叉树的元素,输入-1代表结束输入:"; int num[MAX_NODE_NUM]; int a,i=0; while(cin>>a && a!=-1) { num[i]=a; i++; } if(num[0]==-1) { cout平衡树为空"; T=NULL; return;...

    数据结构与算法(二叉树)

    特点:非线性结构,一个直接前驱,但可能有多个直接后继。     (1)有且仅有一个称为根的结点。     (2)其余结点可分为m(m>=0)个互不相交的有限集合。     T1,T2,…,Tm,其中每个集合又是一颗树,...

    数据结构和算法Flash动画演示

    单链表结点的删除,单链表结点的插入,图的深度优先遍历,基数排序,堆排序,头插法建单链表,寻找中序线索化二叉树指定结点的前驱,寻找中序线索化二叉树指定结点的后继,尾插法建表,希儿排序,开放定址法建立散...

Global site tag (gtag.js) - Google Analytics