标题:关于二叉树的遍历问题请教
取消只看楼主
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
结帖率:100%
已结贴  问题点数:20 回复次数:3 
关于二叉树的遍历问题请教
各位大神,  在二叉树中,如何实现二叉树的中序遍历或后序遍历?    我使用的结构体指针建立的二叉树,但是只实现了前序遍历。 中序遍历和后序遍历不知道如何着手? 请各位大神指点下哈,或者给我个参考资料也行!  谢谢!
搜索更多相关主题的帖子: 参考资料 二叉树 结构体 如何 
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
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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-418667-1-1.html




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

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