| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 606 人关注过本帖
标题:关于二叉树的遍历问题请教
只看楼主 加入收藏
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
关于二叉树的遍历问题请教
各位大神,  在二叉树中,如何实现二叉树的中序遍历或后序遍历?    我使用的结构体指针建立的二叉树,但是只实现了前序遍历。 中序遍历和后序遍历不知道如何着手? 请各位大神指点下哈,或者给我个参考资料也行!  谢谢!
搜索更多相关主题的帖子: 参考资料 二叉树 结构体 如何 
2013-08-05 18:29
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
收藏
得分:0 
把建立的二叉树代码加上! 前序遍历是没问题的,  中序遍历和后序遍历该如何处理吶    大神大神帮帮忙


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define TREE_TYPE int

typedef struct my_tree{
    TREE_TYPE i;
    struct my_tree *right;
    struct my_tree *left;
}tree;

static tree *boot;

void create_tree(TREE_TYPE value)
{   
    tree *tmp = boot; tree *new,*p;
    while(tmp != NULL)
    {   
        if(value == tmp->i) { printf("Value already exists!\n");return; }
        if(value > tmp->i)  
        {
            new=tmp;  tmp = tmp->right;
        }
        else
        {
            new=tmp;  tmp = tmp->left;
        }
    }
    p = malloc(sizeof(tree)); p->i=value;
    if(value > new->i)  new->right=p;
    else new->left=p;
   
    p->right=NULL;p->left=NULL;
}

void pre_print_tree(tree *tmp)
{
    tree *left_left,*right_right;
    printf("%d\t",tmp->i);
    left_left = tmp; right_right = tmp;

    if(left_left->left != NULL)
    { left_left=left_left->left; pre_print_tree(left_left);}
    if(right_right->right!= NULL)
    { right_right=right_right->right; pre_print_tree(right_right);}
}

void main()
{
    TREE_TYPE j=1;
    boot = malloc(sizeof(tree));
    printf("Please enter the date of boot:");
    scanf("%d",&(boot->i));
    boot->right = NULL; boot->left = NULL;

    while(j)
    {
        printf("Please enter the new data:");
        scanf("%d",&j);
        if(j == 0) continue;
        create_tree(j);
    }
    pre_print_tree(boot);    //Preorder Traversal
    printf("\n");
}
2013-08-05 18:39
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:3 
随便一百度,这经典代码都是一堆吧


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-08-05 19:01
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
收藏
得分:2 
对对,经典问题还是百度的快而且多,准

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-08-05 19:05
丶弱水彡千
Rank: 5Rank: 5
来 自:地狱十九层
等 级:职业侠客
威 望:2
帖 子:203
专家分:369
注 册:2013-6-16
收藏
得分:5 
论坛上就很多资源  CSDN里面去找找很多的

这个怎么玩
2013-08-05 20:23
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
程序代码:
void pre_print_tree(tree *tmp)
{
    tree *left_left,*right_right;
    printf("%d\t",tmp->i);//将这句
    left_left = tmp; right_right = tmp;

    if(left_left->left != NULL) 
    { left_left=left_left->left; pre_print_tree(left_left);} 
    //放在这里就是中序
    if(right_right->right!= NULL) 
    { right_right=right_right->right; pre_print_tree(right_right);}
    //放在这里就是后序
}

重剑无锋,大巧不工
2013-08-05 20:36
qjw2719
Rank: 2
等 级:论坛游民
帖 子:21
专家分:33
注 册:2012-3-15
收藏
得分:0 
2013-08-06 12:58
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
收藏
得分:0 
原来是自己对函数递归理解不到位,所以走入了误区,重新理解了一遍递归返回,修改后的遍历程序如下:  其他代码未变!  实现了三种遍历!

void pre_print_tree(tree *tmp)  //前序遍历
{
    if(tmp == NULL) return;
    printf("%d\t",tmp->i);
    pre_print_tree(tmp->left);
    pre_print_tree(tmp->right);
}
void inr_print_tree(tree *tmp)     //中序遍历
{
    if(tmp== NULL) return;
    inr_print_tree(tmp->left);
    printf("%d\t",tmp->i);
    inr_print_tree(tmp->right);
}
void pst_print_tree(tree *tmp)    //后序遍历
{
    if(tmp == NULL) return;
    pst_print_tree(tmp->left);
    pst_print_tree(tmp->right);
    printf("%d\t",tmp->i);
}
2013-08-06 14:22
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
收藏
得分:0 
回复 6楼 beyondyf
我昨天的代码是没法实现中序遍历和后序遍历的,因为我(lef_left=boot)左遍历后,是从根开始(right_right=boot)右遍历的,所以printf语句换动输出也是不正确的。

正确的遍历方法是,左遍历后继续右遍历,而不是返回根再来。  这是因为我昨天对函数递归返回理解有误!


问题已经解决, 谢谢你的帮忙!  
2013-08-06 14:26
快速回复:关于二叉树的遍历问题请教
数据加载中...
 
   



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

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