二叉树遍历 订阅
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。 展开全文
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。
信息
外文名
Binary Tree Traversal
一棵非空的二
由根结点及左、右子树这三个基本
叉    树
部分组成
中文名
二叉树遍历
在任一给定结
可以按某种次序执行三个操作
二叉树遍历算法实现
从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:⑴访问结点本身(N),⑵遍历该结点的左子树(L),⑶遍历该结点的右子树(R)。以上三种操作有六种执行次序:NLR、LNR、LRN、NRL、RNL、RLN。注意:前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。根据访问结点操作发生位置命名:① NLR:前序遍历(Preorder Traversal 亦称(先序遍历))——访问根结点的操作发生在遍历其左右子树之前。② LNR:中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。③ LRN:后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。注意:由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。1.先(根)序遍历的递归算法定义:若二叉树非空,则依次执行如下操作:⑴ 访问根结点;⑵ 遍历左子树;⑶ 遍历右子树。2.中(根)序遍历的递归算法定义:若二叉树非空,则依次执行如下操作:⑴遍历左子树;⑵访问根结点;⑶遍历右子树。3.后(根)序遍历得递归算法定义:若二叉树非空,则依次执行如下操作:⑴遍历左子树;⑵遍历右子树;⑶访问根结点。用二叉链表做为存储结构,中序遍历算法可描述为:void InOrder(BinTree T){ //算法里①~⑥是为了说明执行过程加入的标号① if(T) { // 如果二叉树非空② InOrder(T->lchild);③ printf("%c",T->data); // 访问结点④ InOrder(T->rchild);⑤ }⑥ } // InOrder计算中序遍历拥有比较简单直观的投影法,如图 除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。
收起全文
精华内容
下载资源
问答
  • 二叉树遍历算法二叉树遍历算法二叉树遍历算法二叉树遍历算法二叉树遍历算法二叉树遍历算法
  • 二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历...
  • 二叉树遍历

    2018-09-22 17:38:37
    与二叉树相关的许多算法是建立在二叉树遍历的基础上的。遍历算法可以分为递归和非递归两种,其中 先序遍历、中序遍历、 后续遍历 由递归实现较为方便,而 层序遍历 由非递归实现。 1、先序遍历 遍历过程: 访问根...

    二叉树的遍历

    二叉树的遍历是一种很重要的操作。与二叉树相关的许多算法是建立在二叉树遍历的基础上的。遍历算法可以分为递归和非递归两种,其中 先序遍历中序遍历后续遍历 由递归实现较为方便,而 层序遍历 由非递归实现。

    1、先序遍历

    遍历过程:

    1. 访问根节点
    2. 访问左子树
    3. 访问右子树

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uth05VJT-1572855788442)(https://github.com/HiXinJ/myhomework/blob/gh-pages/images/TreeTraversal.png?raw=true)]

    遍历次序:7 ( 8 5 1 2 ) ( 4 0 )

    代码如下:

    void preorder(Tree T)
    {
        if (T){   
            visit(T);           //访问根节点
            preorder(T->left);  //访问左子树
            preorder(T->right); //访问右子树
        }
    }
    

    2、中序遍历

    遍历过程:

    1. 访问左子树
    2. 访问根节点
    3. 访问右子树

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ZtvGJ2W-1572855788443)(https://github.com/HiXinJ/myhomework/blob/gh-pages/images/TreeTraversal.png?raw=true)]

    遍历次序:( 5 8 1 2 ) 7 ( 4 0 )

    代码如下:

    void inorder(Tree T)
    {
        if (T){
            inorder(T->left);   //访问左子树
            visit(T);           //访问根节点
            inorder(T->right);  //访问右子树
        }
    }
    

    3、后序遍历

    遍历过程

    1. 访问左子树
    2. 访问右子树
    3. 访问根节点

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2zBHdtpp-1572855788444)(https://github.com/HiXinJ/myhomework/blob/gh-pages/images/TreeTraversal.png?raw=true)]

    遍历次序:( 5 2 1 8 ) ( 0 4 ) 7

    代码如下:

    void postorder(Tree T)
    {
        if (T){
            postorder(T->left);     //访问左子树
            postorder(T->right);    //访问右子树
            visit(T);               //访问根节点
        }
    }
    

    4、层序遍历

    层序遍历和宽度优先搜索类似,遍历过程从左到右,从上到下。

    实现方法:使用队列,首先根节点入队,然后循环:

    1. 节点出队
    2. 访问该节点
    3. 左儿子入队
    4. 右儿子入队

    例如上图的遍历次序:7 8 4 5 1 0 2

    代码如下:

    void BFS(Tree T)
    {
        if (!T)
            return;
        std::queue<Tree> Q;
        Q.push(T);
        Tree tmp;
        while (!Q.empty()){
            tmp = Q.front();
            Q.pop();
            visit(tmp);
            if (tmp->left)
                Q.push(tmp->left);
            if (tmp->right)
                Q.push(tmp->right);
        }
    }
    
    展开全文
  • 文章目录二叉树及二叉树遍历完全二叉树二叉树的遍历前序遍历中序遍历后序遍历遍历的性质 二叉树及二叉树遍历 完全二叉树 对于一棵具有n个节点的二叉树(按层序编号),如果编号为i的节点与同样深度的满二叉树中编号...

    二叉树及二叉树遍历

    完全二叉树

    对于一棵具有n个节点的二叉树(按层序编号),如果编号为i的节点与同样深度的满二叉树中编号为i的节点在二叉树的位置完全相同,则为完全二叉树。完全二叉树是线段树的基础,他独特的编号方式使得其可以不依赖于指针进行操作。
    在这里插入图片描述
    左边二叉树按照完全二叉树进行编号,出现了10号的空挡,右边二叉树出现了6,7号的空挡,所以以上两棵树都不是完全二叉树。

    二叉树的遍历

    二叉树的遍历主要包括前序遍历、中序遍历、后序遍历和层序遍历四种,其中前三种是非常常用的,下面主要介绍前三种遍历的方法。

    前序遍历

    若二叉树为空,则空操作返回,否则先访问根节点,然后前序遍历左子树,再前序遍历右子树。如下图所示:

    在这里插入图片描述

    void PreOrderTraverse(BiTree T)
    {
        if(T==NULL)
            return;
        printf("%c", T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
    

    中序遍历

    若二叉树为空,则空操作返回,否则从根节点开始(注意不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历右子树。如下图所示:

    在这里插入图片描述

    void InOrderTraverse(BiTree T)
    {
        if(T==NULL)
            return; 
        InOrderTraverse(T->lchild);
        printf("%c", T->data);
        InOrderTraverse(T->rchild);
    }
    

    后序遍历

    若二叉树为空,则空操作返回,否则从左到右先叶子后节点的方式遍历访问左右子树,最后是访问根节点。

    在这里插入图片描述

    void PostOrderTraverse(BiTree T)
    {
        if(T==NULL)
            return; 
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        printf("%c", T->data);
    }
    

    遍历的性质

    两个二叉树遍历的性质:

    1、已知前序遍历和中序遍历,可以唯一的确定一个二叉树;

    2、已知后序遍历和中序遍历,可以唯一的确定一个二叉树;

    但是,已知前序遍历和后序遍历,是不能唯一的确定一棵二叉树的。比如,前序遍历ABC,后续遍历CBA,我们可以确定A是根节点,但是无法确定那个是左子树,哪个是右子树。

    在这里插入图片描述

    展开全文
  • 图解二叉树及二叉树遍历

    万次阅读 多人点赞 2017-03-11 20:53:50
    二叉树及二叉树遍历 完全二叉树 二叉树的遍历 遍历的性质 1、完全二叉树 对于一棵具有n个节点的二叉树(按层序编号),如果编号为i的节点与同样深度的满二叉树中编号为i的节点在二叉树的位置完全相同,则为完全...

    二叉树及二叉树遍历

    • 完全二叉树
    • 二叉树的遍历
    • 遍历的性质

    1、完全二叉树

    对于一棵具有n个节点的二叉树(按层序编号),如果编号为i的节点与同样深度的满二叉树中编号为i的节点在二叉树的位置完全相同,则为完全二叉树。

    换句话来说,如果每个节点按照满二叉树的结构逐层顺序进行编号,如果编号出现编号空挡,就说明不是完全二叉树,否则就是。如下图所示:

    这里写图片描述

    左边二叉树按照完全二叉树进行编号,出现了10号的空挡,右边二叉树出现了6,7号的空挡,所以以上两棵树都不是完全二叉树。

    2、二叉树的遍历

    二叉树的遍历主要包括前序遍历、中序遍历、后序遍历和层序遍历四种,其中前三种是非常常用的,下面主要介绍前三种遍历的方法。

    • 前序遍历

    若二叉树为空,则空操作返回,否则先访问根节点,然后前序遍历左子树,再前序遍历右子树。如下图所示:

    这里写图片描述

    void PreOrderTraverse(BiTree T)
    {
        if(T==NULL)
            return;
        printf("%c", T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }

    其实前序遍历的技巧还可以有如下方式:

    这里写图片描述

    1、从根节点的左边开始,绕过所有节点和边,画出一条封闭的、有向的遍历曲线(如上图红色所示)。

    2、对于每个节点,曲线第一次从连线进入节点的位置标记为1,最后一次从节点出去的位置标记为2 。

    3、如上图的标记所示,沿着遍历曲线的方向,依次经过标记为1的节点为前序遍历序列:ABEFIJCDGH 。

    • 中序遍历

    若二叉树为空,则空操作返回,否则从根节点开始(注意不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历右子树。如下图所示:

    这里写图片描述

    void InOrderTraverse(BiTree T)
    {
        if(T==NULL)
            return; 
        InOrderTraverse(T->lchild);
        printf("%c", T->data);
        InOrderTraverse(T->rchild);
    }

    同样根据上一节前序遍历的技巧,同样适用于中序遍历,但是相对复杂一些:

    这里写图片描述

    1、对于所有叶子节点,在标记1和2中间加上标记0。

    2、当父节点只有左子树时,在该节点右下方标记0;当父节点只有右子树时,在该节点的左下方标记0 。

    3、当父节点同时有左右子树时,在其正下方标记0 。

    4、沿着遍历曲线的方向,依次经过标记为0的节点为中序遍历序列:DGBAECHF 。

    • 后序遍历

    若二叉树为空,则空操作返回,否则从左到右先叶子后节点的方式遍历访问左右子树,最后是访问根节点。

    这里写图片描述

    void PostOrderTraverse(BiTree T)
    {
        if(T==NULL)
            return; 
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        printf("%c", T->data);
    }

    其实后序遍历的技巧和前序遍历的基本是差不多的,有如下方式:

    这里写图片描述

    沿着遍历曲线的方向,依次经过标记为2的节点为后序遍历序列:EIJFBCGHDA 。

    3、遍历的性质

    两个二叉树遍历的性质:
    1、已知前序遍历和中序遍历,可以唯一的确定一个二叉树;
    2、已知后序遍历和中序遍历,可以唯一的确定一个二叉树;

    但是,已知前序遍历和后序遍历,是不能唯一的确定一棵二叉树的。比如,前序遍历ABC,后续遍历CBA,我们可以确定A是根节点,但是无法确定那个是左子树,哪个是右子树。

    这里写图片描述

    展开全文
  • 二叉树 遍历

    2013-10-15 14:14:06
    二叉树、满二叉树、完全二叉树 前序遍历:根节点->左孩子->右孩子 中序遍历:左孩子->根节点->右孩子 后序遍历:左孩子->右孩子->根节点 命名是根据访问根节点的... 1:有一颗二叉树:前序遍历输出的字符串顺序为:ABCD

    参考:http://itcome.blog.51cto.com/1541534/1015034

    二叉树、满二叉树、完全二叉树、平衡二叉树

    什么是平衡二叉树?

    左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。

    前序遍历:根节点->左孩子->右孩子

    中序遍历:左孩子->根节点->右孩子

    后序遍历:左孩子->右孩子->根节点

    命名是根据访问根节点的顺序而定的。

    一:笔试题描述

        1:有一颗二叉树:前序遍历输出的字符串顺序为:ABCDEFG

                                       中序遍历输出的顺序是:CBDAEGF

       2:问?请根据前序和中序遍历出的结果,推断出后序遍历输出的结果?

     二:解决以上问题依据的知识点如下:

          二叉树三种遍历的方式:

               前序遍历(NLR): 根->左孩子->右孩子

             中序遍历(LNR):  左孩子->根->右孩子

             后序遍历(LRN):  左孩子->右孩子->根

     三:问题分析

      第一步:前序:ABCDEFG

                      根据前序遍历的原则我们可以确定:二叉树的根元素为:A

    第二步:根据中序 CBDAEGF

    1:原则:左孩子->根->右孩子

    2:推出:CBD(根左边的元素)  A(根元素)  EGF(根右边的元素)

     

     第三步:根据 前序和中序输出的结果来还原一棵二叉树

       前序输出:A(根)  BCD(左边元素) EFG(右边的元素)

       根据前序遍历的原则:根->左孩子->右孩子

       推出:如下图:

     

     第四步:B元素后面是C元素,C元素有二种可能1:B的左孩子2:B的右孩子

       我们假设C是B的右孩子:得到如下图:

     

    验证:我们来看看中序:CBD(左边元素)   A(根)    EGF(右边元素) 

                中序的遍历规则是: 左孩子->根->右孩子,如果按照上面的假设C是B的右孩子

                中序遍历时应该是:BC..显然不对,因此C应该是B的左孩子.因此进一步得出如下:


    第五步: 根据前序:A(根) BCD(根左边的元

    素)  EFG(根右边的元素)

     

    分析:

    C元素后面紧跟是D元素

    D元素现在有三种可能:B的右孩子,C的左孩子或者右孩子

     

    1:如果D是C的左孩子,图下图:

     

     

    验证:

    1:如果D是C的右孩子,那么中序遍历根的左边应该是:DCB与中序CBD不相符合,所以不对
    2:如果是右孩子:中序遍历,根的左边应该是:CDB与CBD也不相符合,所以不对

    3:综上得出D应该是B的右孩子,如下图:

     

    第六步:根据以上的思路,我可以把根的右边也还原,得出完整的二叉树结构如下:

     

     

     

    第七步:根据后序遍历:左孩子->右孩子->根的遍历原则:

                 因此很容易得出后序为:CDBGFEA

    所以最终答案 为:CDBGFEA


    展开全文
  • 我是怎么一步一步调试出来二叉树的遍历,二叉树遍历再也不用愁了
  • 二叉树遍历算法

    千次阅读 2019-10-27 01:02:12
    二叉树遍历方式有很多,所以如下介绍的遍历方式,我们约定从左往右进行遍历。 我们需要遍历的树结构如下: 下面的遍历算法用Python实现,不会Python的同学不用担心,因为算法逻辑很简单。 先看下我们的节点对象的定...
  • 二叉树遍历小结

    千次阅读 2017-06-17 11:58:44
    二叉树遍历小结二叉树遍历小结 声明 二叉树遍历概述 前序遍历 1 非递归实现 2 递归实现 中序遍历 1 非递归实现 2 递归实现 后序遍历 1 非递归实现 2 递归实现 层序遍历 声明文章均为本人技术笔记,转载请注明出处: ...
  • js实现二叉树遍历

    千次阅读 2019-05-16 11:46:07
    js实现二叉树遍历二叉树遍历1、递归遍历(前、中、后)2、层序遍历3、重建二叉树参考文献 二叉树遍历 常用的二叉树的遍历方式:前序遍历、中序遍历、后序遍历、层序遍历 (1)前序遍历:左、右、根; (2)中序遍历...
  • Problem C: 二叉树遍历 题目 Description 二叉树的前序、中序、后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树; 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后...
  • 二叉树遍历算法 其中我把递归遍历算法注释掉了,因为比较容易理解。 public class TreeTest { public static void main(String[] args) { Tree tree = initTree(); // DLR(tree); // System.out.println("=====")...
  • 一、提供二叉树遍历结果推出二叉树 1.1利用前序(先序)遍历和中序遍历: 1.2利用中序遍历和后序遍历 (参考如何利用前序遍历的推演 在中序遍历中确定 结点相对位置) 1.3利用前序(先序)遍历和后序遍历 前序...
  • 二叉树遍历方法

    2015-07-10 15:53:39
    二叉树遍历: 先序遍历: 先序遍历也叫做先根遍历、前序遍历,可记做根左右(二叉树父结点向下先左后右)。 首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后...
  • 二叉树遍历的迭代版算法

    千次阅读 2019-07-26 20:17:34
    二叉树遍历用递归实现是很简单的,但相对迭代算法来说效率太低。所以这里我们介绍迭代的方法来实现二叉树遍历。可以帮助我们更好的理解二叉树。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 89,898
精华内容 35,959
关键字:

二叉树遍历