| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3171 人关注过本帖
标题:二叉树的遍历的问题
只看楼主 加入收藏
cheetah
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:120
专家分:118
注 册:2013-6-29
结帖率:85.71%
收藏
已结贴  问题点数:20 回复次数:15 
二叉树的遍历的问题
图片附件: 游客没有浏览图片的权限,请 登录注册

如图:请高手写一下前序遍历,中序遍历,后序遍历的顺序,不需要代码,只要写出遍历的顺序就可以了如:ABCDEFG
我实在是搞不懂这个顺序是怎么弄的,非常感谢!

[此贴子已经被作者于2016-2-9 19:36编辑过]

搜索更多相关主题的帖子: ABCDEFG 二叉树 
2016-02-09 13:10
拉链
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:107
专家分:534
注 册:2016-1-22
收藏
得分:1 
我好像会遍历,可不懂前序中序呀!
2016-02-09 18:24
cheetah
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:120
专家分:118
注 册:2013-6-29
收藏
得分:0 
以下是引用拉链在2016-2-9 18:24:45的发言:

我好像会遍历,可不懂前序中序呀!

不需要程序的,只要写出遍历的顺序就可以了,即经过结点的顺序用图中的字母表示

天道酬勤
2016-02-09 19:37
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
算法書上有這樣的順序,多看書。
收到的鲜花
  • cheetah2016-02-12 11:33 送鲜花  1朵  

授人以渔,不授人以鱼。
2016-02-11 12:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:6 
其實抓住事物的本質,自己想也可以找到解決辦法,不必完全按照書上來。二叉樹的遍歷,本質上是把非缐性結構缐性化,即把二叉樹化成鏈表。你用紙筆畫出來,看著一棵二叉樹,用走迷宮的方法,畫出一條路缐,把所有結點都通過一次,而這條路缐最終看起來,是一條直缐,這就是遍歷。而所謂前中後序,不過是對一個結點來説,是先訪問它的左邊還是右邊、抑或是分別兩邊。同樣是前序,也分從左邊走還是從右邊走,所以每種序有2次遞歸,總起來有6種走法。

授人以渔,不授人以鱼。
2016-02-11 13:26
杭01
Rank: 3Rank: 3
来 自:广州
等 级:论坛游侠
威 望:1
帖 子:29
专家分:132
注 册:2016-2-11
收藏
得分:6 
算法书上找的,希望能帮到您:
前序遍历:中 左 右
中序遍历:左 中 右
后序遍历:左 右 中
就这张图来说,您可以借鉴一个二叉树实现,然后写几行代码即可。
注:第一次的代码有问题,以下是更正过的代码与输出:
您可以像我这样:
程序代码:
#include <stdio.h>

#include <stdlib.h>

/* BEGIN COPY

 *

 * Copied from

 * http://touch-2011.

 *

 * 2016-2-12编辑了中序,后序,修改了错误

 */
    /* 二叉树的节点定义   */
    typedef struct TreeNode

    {

        char ch;                  /* 数据域   */
        struct TreeNode *lchild;  /* 左孩子   */
        struct TreeNode *rchild;  /* 右孩子   */
    }BTNode,*PBTNode;

    


    /* 先序遍历二叉树   */
    void preOrder(PBTNode root)

    {

        if(root==NULL)

            return;

        printf("%-3c",root->ch);

        preOrder(root->lchild);

        preOrder(root->rchild);

    }

    


    /* 中序遍历二叉树   */
    void inOrder(PBTNode root)

    {

        if(root==NULL)

            return;

        inOrder(root->lchild);

        printf("%-3c",root->ch);

        inOrder(root->rchild);

    }

    


    /* 后序遍历二叉树   */
    void postOrder(PBTNode root)

    {

        if(root==NULL)

            return;

        postOrder(root->lchild);

        postOrder(root->rchild);

        printf("%-3c",root->ch);

    }

    /* 销毁一颗二叉树   */
    void clear(PBTNode* root)

    {

        PBTNode pl,pr;

        if(*root==NULL)

            return;

        pl=(*root)->lchild;

        pr=(*root)->rchild;

        (*root)->lchild=NULL;

        (*root)->rchild=NULL;

        free((*root));

        *root=NULL;

        clear(&pl);

        clear(&pr);

    }

/* END COPY */

#define F malloc(sizeof(BTNode))

PBTNode buildTree(char value, PBTNode left, PBTNode right) {
    PBTNode n = F;
    n->ch = value;
    n->lchild = left;
    n->rchild = right;
    return n;
}

#define buildTreeLeaf(value) buildTree(value, NULL, NULL)

int main(int argc, char const *argv[])
{
    /* Build Tree
     * From bottom to top
     */
    PBTNode root =
        buildTree('A',
                  buildTree('B',
                            buildTree('D',
                                      buildTreeLeaf('H'),
                                      buildTreeLeaf('I')),
                            buildTree('E',
                                      buildTreeLeaf('J'),
                                      buildTreeLeaf('K'))),
                  buildTree('C',
                            buildTreeLeaf('F'),
                            buildTreeLeaf('G')));

    puts("\nPre-Order:");
    preOrder(root);
    puts("\nIn-Order:");
    inOrder(root);
    puts("\nPost-Order:");
    postOrder(root);

    clear(&root);
    return 0;
}

输出:
C:\Documents and Settings\Administrator\桌面>gcc foo.c -Wall && a.exe

Pre-Order:
A  B  D  H  I  E  J  K  C  F  G  
In-Order:
H  D  I  B  J  E  K  A  F  C  G  
Post-Order:
H  I  D  J  K  E  B  F  G  C  A  



[此贴子已经被作者于2016-2-12 12:33编辑过]


准备中考中,有事请Email :)

Email: huihan9 AT qq DOT com
QQ: 2672286148
cnblogs: jt2001
2016-02-11 15:58
拉链
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:107
专家分:534
注 册:2016-1-22
收藏
得分:6 
回复 6楼 杭01
尽管你给出了代码,我觉得你的结果还是错了。无论哪种序,都可通过相类似的递归实现,只是记录节点的顺序不同,我觉得结果如下:
前序:abdhiejkcfg
中序:hdibjekafcg
后序:hidjkebfgca
其中,中序结果符合百度里所说的投影法。
收到的鲜花
  • 杭012016-02-12 17:22 送鲜花  1朵   附言:我很赞同
2016-02-12 07:39
杭01
Rank: 3Rank: 3
来 自:广州
等 级:论坛游侠
威 望:1
帖 子:29
专家分:132
注 册:2016-2-11
收藏
得分:1 
回复 7楼 拉链
感谢您的指正。:-)
我检查了一遍代码,发现中序、后序部分的递归调用都写错了,马上改正过来。

准备中考中,有事请Email :)

Email: huihan9 AT qq DOT com
QQ: 2672286148
cnblogs: jt2001
2016-02-12 10:35
cheetah
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:120
专家分:118
注 册:2013-6-29
收藏
得分:0 
谢谢大家的指点,我到现在还有一个问题不明白:不管是前,中,后序遍历的顺序是有很多种还是只有一种啊,为什么同样的树书上说的和网上查的遍历的顺序结果都不一样呢?例如:这个树
图片附件: 游客没有浏览图片的权限,请 登录注册
百度百科上说中序的遍历是:DBEAFC,而有的书上说是:DBEACF,到底应该是哪一种呢

天道酬勤
2016-02-12 11:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 9楼 cheetah
DBEACF,不過,如果他寫出來的代碼能得到那樣的結果,那也是可以的。

[此贴子已经被作者于2016-2-12 12:32编辑过]


授人以渔,不授人以鱼。
2016-02-12 12:12
快速回复:二叉树的遍历的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022027 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved