| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 653 人关注过本帖
标题:二叉树递归遍历二叉树,我的中序和后序输出是不对的,我不知道哪里错了,帮 ...
只看楼主 加入收藏
支风儿
Rank: 2
等 级:论坛游民
帖 子:25
专家分:13
注 册:2013-4-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
二叉树递归遍历二叉树,我的中序和后序输出是不对的,我不知道哪里错了,帮帮忙
#include <stdio.h>
#include <malloc.h>
#define TRUE 1
#define FALSE 0
#define OK  1
#define ERROR  0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int  Status;

typedef char  ElemType;
typedef struct BiTNode{
  ElemType data;
  struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;

BiTree CreateBiTree(BiTree &T) {  // 算法6.4
  // 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树,
  // 构造二叉链表表示的二叉树T。
  char ch;
  scanf("%c",&ch);
  if (ch=='#')
  T = NULL;
  else {
    if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))
    return ERROR;
    T->data = ch;              // 生成根结点
    CreateBiTree(T->lchild);   // 构造左子树
    CreateBiTree(T->rchild);   // 构造右子树
  }
  return T;
} // CreateBiTree


Status Visit( ElemType e ) {  // 输出元素e的值
     if(e!='#')
    {printf("%c", e );
      return OK;}
    else
    return ERROR;
}// PrintElement


Status PreOrderTraverse( BiTree T) {
   // 算法6.1
   // 采用二叉链表存储结构,Visit是对数据元素操作的应用函数,
   // 先序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
   // 最简单的Visit函数是:
   //     Status PrintElement( ElemType e ) {  // 输出元素e的值
   //        printf( e );  // 实用时,加上格式串
   //        return OK;
   //     }
   // 调用实例:PreOrderTraverse(T, PrintElement);
   if (T) {
      if (Visit(T->data))
         if (PreOrderTraverse(T->lchild))
            if (PreOrderTraverse(T->rchild))
                return OK;
      return ERROR;
   } else return OK;
} // PreOrderTraverse

Status InOrderTraverse(BiTree T)
{
    if(T)
    {
        if(InOrderTraverse(T->lchild))
            if(Visit(T->data))
                if(InOrderTraverse(T->rchild))
                    return OK;
        return ERROR;
    }
    else
        return OK;
} // InOrderTraverse

Status PostOrderTraverse( BiTree T ) {
     // 后序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。

   if (T) {
       if (PostOrderTraverse(T->rchild))
          if (PostOrderTraverse(T->lchild))
            if  (Visit(T->data))
              return OK;
      return ERROR;
   }
    else return OK;
} // PostOrderTraverse



int main()   //主函数
{  BiTree T;
   CreateBiTree(T);
   PreOrderTraverse(T);
   printf("\n");
   InOrderTraverse(T);
   printf("\n");
   PostOrderTraverse(T);
   printf("\n");
   return OK;
                      //补充代码
 }//main
搜索更多相关主题的帖子: include 二叉树 
2013-04-22 23:12
不玩虚的
Rank: 9Rank: 9Rank: 9
来 自:四川
等 级:贵宾
威 望:10
帖 子:331
专家分:1301
注 册:2012-12-9
收藏
得分:10 
遍历能不能把除了if(T)之外的if都去掉啊,你建二叉树为啥不这么写,遍历为啥要这么写啊,你自己想想逻辑吧。

同学习......同进步....你帮我......我帮你.....上善若水.....
2013-04-23 00:04
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:10 
if (T) {
      if (Visit(T->data))
         if (PreOrderTraverse(T->lchild))
            if (PreOrderTraverse(T->rchild))
                return OK;
这么多if真的没有用!
给你个例子:
void InOrder(BiTree T){

    if(T!=NULL)         //=NULL是递归结束条件
    {
        InOrder(T->lchild);        //中序遍历根的左子树
     printf("%c",T->data);          //访问根结点
        InOrder(T->rchild);          //右子树
    }

[ 本帖最后由 邓士林 于 2013-4-24 19:07 编辑 ]

Maybe
2013-04-24 19:05
快速回复:二叉树递归遍历二叉树,我的中序和后序输出是不对的,我不知道哪里错了 ...
数据加载中...
 
   



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

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