• 树的先序、中序和后序遍历方式


    前序遍历

    前序遍历(DLR

    前序遍历也叫做先根遍历、先序遍历,可记做根左右。

    前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。

    二叉树为空则结束返回,否则:

    1)访问根结点。

    2)前序遍历左子树

    3)前序遍历右子树

    需要注意的是:遍历左右子树时仍然采用前序遍历方法。

    如右图所示二叉树

      

    前序遍历,也叫先根遍历,遍历的顺序是,根,左子树,右子树

    遍历结果:ABDECF

    中序遍历,也叫中根遍历,顺序是 左子树,根,右子树

    遍历结果:DBEAFC

    后序遍历,也叫后根遍历,遍历顺序,左子树,右子树,根

    遍历结果:DEBFCA

    编辑本段程序实现

    树的遍历一般都用递归实现,比较方便

    C语言版本

    树中节点结构为:

    typedef struct TreeNode

    {

    int data;

    TreeNode * left;

    TreeNode * right;

    TreeNode * parent;

    }TreeNode;

    void pre_order(TreeNode* Node)

    {

    if(Node != NULL)

    {

    printf("%d ",Node->data);

    pre_order(Node->left);

    pre_order(Node->right);

    }

    }

    调用时: pre_order(Root); //Root为树的根

     

    从 <http://baike.baidu.com/view/1455146.htm> 插入

     

     

     

     

     

     

     

     

    中序遍历

    中序遍历(LDR

      

    中序遍历也叫做中根遍历,可记做左根右。

    中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。在遍历左、右子树时,仍然先遍历左子树,再访问根结点,最后遍历右子树。即:

    二叉树为空则结束返回,

    否则:

    1)中序遍历左子树。

    2)访问根结点。

    3)中序遍历右子树。

    注意的是:遍历左右子树时仍然采用中序遍历方法。

    即左子树(B D E)还是左边开始(D),然后是(B,再是右边(E),完后经过(A),接着右子树(C F 还是左边开始(F,再是中间(C),

    即顺序是DBEAFC

    中序遍历的时间复杂度为:O(n)

    如果一颗二叉排序树的节点值是数值,中序遍历的结果为升序排列的数组。可以利用该性质检测一棵树是否为二叉排序数。

    编辑本段程序实现

    c++版本

    树中节点结构为:

    typedef struct TreeNode

    {

    int data;

    TreeNode * left;

    TreeNode * right;

    TreeNode * parent;

    }TreeNode;

    voidmiddle_order(TreeNode * Node)

    {

    if(Node != NULL)

    {

    middle_order(Node->left);

    printf("%d ",Node->data);

    middle_order(Node->right);

    }

    }

    调用时: middle_order(Root); //Root为树的根

    Java版本

    class TreeNode{

    public int data;

    public TreeNodeleftChild;

    public TreeNoderightChild;

    public static voidinOrderTraversal(TreeNode node){

    if(node == null){

    return;

    }else{

    inOrderTraversal(node.leftChild);

    System.out.println(node.data);

    inOrderTRaversal(node.rightChild);

    }

    }

    }

     

    从 <http://baike.baidu.com/view/1455143.htm> 插入

     

     

     

    后序遍历

    求助编辑百科名片

    后序遍历是二叉树遍历的一种。后序遍历指在访问根结点、遍历左子树与遍历右子树三者中,首先遍历左子树,然后遍历右子树,最后遍历访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。后序遍历有递归算法和非递归算法两种。

    目录

    递归算法

    非递归算法

    编辑本段递归算法

    算法描述:

    1)若二叉树为空,结束

    2)后序遍历左子树

    3)后序遍历右子树

    4)访问根结点

      

    遍历结果:DEBFCA

    伪代码

    PROCEDURE POSTRAV(BT)

    IF BT<>0 THEN

    {

    POSTRAV(L(BT))

    POSTRAV(R(BT))

    OUTPUT V(BT)

    }

    RETURN

    c语言描述

    struct btnode

    {

    int d;

    struct btnode *lchild;

    struct btnode *rchild;

    };

    void postrav(structbtnode *bt)

    {

    if(bt!=NULL)

    {

    postrav(bt->lchild);

    postrav(bt->rchild);

    printf("%d",bt->d);

    }

    }

    编辑本段非递归算法

    算法1c语言描述):

    void postrav1(structbtnode *bt)

    {

    struct btnode *p;

    struct

    {

    struct btnode *pt;

    int tag;

    }st[MaxSize];

    }

    int top=-1;

    top++;

    st[top].pt=bt;

    st[top].tag=1;

    while(top>-1) /*不为空*/

    {

    if(st[top].tag==1)/*不能直接访问的情况*/

    {

    p=st[top].pt;

    top--;

    if(p!=NULL)

    {

    top++; /*根结点*/

    st[top].pt=p;

    st[top].tag=0;

    top++; /*右孩子结点*/

    st[top].pt=p->p->rchild;

    st[top].tag=1;

    top++; /*左孩子结点*/

    st[top].pt=p->lchild;

    st[top].tag=1;

    }

    }

    if(st[top].tag==0)/*直接访问的情况*/

    {

    printf("%d",st[top].pt->d);

    top--;

    }

    }

    }

    算法2

    void postrav2(structbtnode *bt)

    {

    struct btnode*st[MaxSize],*p;

    int flag,top=-1;

    if(bt!=NULL)

    {

    do

    {

    while(bt!=NULL)

    {

    top++;

    st[top]=bt;

    bt=bt->lchild;

    }

    p=NULL;

    flag=1;

    while(top!=-1&& flag)

    {

    bt=st[top];

    if(bt->rchild==p)

    {

    printf("%d",bt->d);

    top--;

    p=bt;

    }

    else

    {

    bt=bt->rchild;

    flag=0;

    }

    }

    }while(top!=-1)

    printf(" ");

    }

    }

     

    从 <http://baike.baidu.com/view/1490835.htm> 插入

  • 相关阅读:
    视觉(9)争取快点看完基于图论的立体匹配算法
    STL笔记(2) STL之父访谈录
    视觉(7)Computer vision from Wikipedia
    *NIX工具使用(1) Vim notes
    STL笔记(1)map
    AI杂谈(1) 你喜欢ML里的哪些模型?希望ML未来向什么方向发展?
    AI杂谈(3): dodo:人脸识别方法个人见解(zz from prfans)
    AI杂谈(2)请教支持向量机用于图像分类
    视觉(3)blepo
    windows编程(2)深入探讨MFC消息循环和消息泵
  • 原文地址:https://www.cnblogs.com/Berryxiong/p/6434744.html
Copyright © 2020-2023  润新知