| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 596 人关注过本帖
标题:二叉树的递归递归遍历有错误?
只看楼主 加入收藏
qq8801103
Rank: 5Rank: 5
来 自:苏州中科大软件学院
等 级:职业侠客
威 望:1
帖 子:422
专家分:340
注 册:2009-10-8
结帖率:73.96%
收藏
已结贴  问题点数:10 回复次数:2 
二叉树的递归递归遍历有错误?
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTnode
{
     char data;
     struct bitnode *lchild,*rchild;
}BiTnode,*BiTree;
BiTree createtree()
{
    char a;BiTree root;
    scanf("%c",&a);
 fflush(stdin);
    if(a=='#')return NULL;
    else
 {
   root=(BiTnode *)malloc(sizeof(BiTnode));
         root->data=a;
         root->lchild=createtree();
         root->rchild=createtree();
 }
 return root;
}

void inorder(BiTree root)
{
 BiTree s[100];
 int top=0;
 while(root||top)
 {
  while(root)
  {
   s[++top]=root;root=root->lchild;
  }
  if(top)
  {
   putchar(s[top]->data);
   root=s[top--]->rchild;
  }
 }
}
void main()
{
 BiTree root=NULL;
 root=createtree();
 inorder(root);
 printf("\n");
}
搜索更多相关主题的帖子: 二叉树 遍历 递归 
2010-05-12 11:53
hzh512
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:234
专家分:1333
注 册:2009-6-5
收藏
得分:10 
这种问题已在作业贴合集中了 https://bbs.bccn.net/thread-306037-1-1.html

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

typedef struct BiTnode
{
    char data;
    struct BiTnode *lchild,*rchild;
}BiTnode,*BiTree;

BiTree createtree();
void inorder(BiTree root);

void main()
{
    BiTree root=NULL;
    root=createtree();
    inorder(root);
    printf("\n");
}

BiTree createtree()
{
    char a;
    BiTree root;
    scanf("%c",&a);
//  fflush(stdin);
    if(a=='#')
        return NULL;
    else
    {
        root=(BiTnode *)malloc(sizeof(BiTnode));
        root->data=a;
        root->lchild=createtree();
        root->rchild=createtree();
    }
    return root;
}

void inorder(BiTree root)
{
    BiTree s[100];
    int top=0;
    while(root||top)
    {
        while(root)
        {
            s[++top]=root;root=root->lchild;
        }
        if(top)
        {
            putchar(s[top]->data);
            root=s[top--]->rchild;
        }
    }
}

编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
2010-05-12 13:46
浩凡儿
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:101
专家分:394
注 册:2010-10-30
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
#define QUEUE_MAXSIZE 50
typedef char DATA;       //定义元素类型
typedef struct ChainTree  //定义二叉树结点类型
{
    DATA data;    //元素数据
    struct ChainTree *left;    //左子树结点指针
    struct ChainTree *right;    //右子树结点指针
}ChainBinTree;
ChainBinTree *BinTreeInit(ChainBinTree *node) //初始化二叉树根结点
{
     if(node!=NULL) //若二叉树根结点不为空
         return node;
     else
         return NULL;
}
int BinTreeAddNode(ChainBinTree *bt,ChainBinTree *node,int n) //添加数据到二叉树
//bt为父结点,node为子结点,n=1表示添加左子树,n=2表示添加右子树
{
    if(bt==NULL)
    {
        printf("父结点不存在,请先设置父结点!\n");
        return 0;
    }
    switch(n)
    {
        case 1: //添加到左结点
            if(bt->left) //左子树不为空
            {
                printf("左子树结点不为空!\n");
                return 0;
            }else
                bt->left=node;
            break;
        case 2://添加到右结点
            if( bt->right) //右子树不为空
            {
                printf("右子树结点不为空!\n");
                return 0;
            }else
                bt->right=node;
            break;
        default:
            printf("参数错误!\n");
            return 0;
    }
    return 1;
}
ChainBinTree *BinTreeLeft(ChainBinTree *bt) //返回左子结点
{
    if(bt)
        return bt->left;
    else
        return NULL;
}
ChainBinTree *BinTreeRight(ChainBinTree *bt) //返回右子结点
{
    if(bt)
        return bt->right;
    else
        return NULL;
}
int BinTreeIsEmpty(ChainBinTree *bt) //检查二叉树是否为空,为空则返回1,否则返回0
{
    if(bt)
        return 0;
    else
        return 1;
}
int BinTreeDepth(ChainBinTree *bt) //求二叉树深度
{
    int dep1,dep2;
    if(bt==NULL)
        return 0; //对于空树,深度为0
    else
    {
        dep1 = BinTreeDepth(bt->left); //左子树深度 (递归调用)
        dep2 = BinTreeDepth(bt->right); //右子树深度 (递归调用)
        if(dep1>dep2)
           return dep1 + 1;
        else
            return dep2 + 1;
    }
}
ChainBinTree *BinTreeFind(ChainBinTree *bt,DATA data) //在二叉树中查找值为data的结点
{
    ChainBinTree *p;
    if(bt==NULL)
        return NULL;
    else
    {
        if(bt->data==data)
            return bt;
        else{ // 分别向左右子树递归查找
            if(p=BinTreeFind(bt->left,data))
                return p;
            else if(p=BinTreeFind(bt->right, data))
                return p;
            else
                return NULL;
        }
    }
}
void BinTreeClear(ChainBinTree *bt) // 清空二叉树,使之变为一棵空树
{
     if(bt)
     {
         BinTreeClear(bt->left); //清空左子树
         BinTreeClear(bt->right);//清空右子树
         free(bt);//释放当前结点所占内存
         bt=NULL;
     }
     return;
}
void BinTree_DLR(ChainBinTree *bt,void (*oper)(ChainBinTree *p))  //先序遍历
{     
     if(bt)//树不为空,则执行如下操作
     {
         oper(bt); //处理结点的数据
         BinTree_DLR(bt->left,oper);
         BinTree_DLR(bt->right,oper);
     }
     return;
}
void BinTree_LDR(ChainBinTree *bt,void(*oper)(ChainBinTree *p))  //中序遍历
{
     if(bt)//树不为空,则执行如下操作
     {
         BinTree_LDR(bt->left,oper); //中序遍历左子树
         oper(bt);//处理结点数据
         BinTree_LDR(bt->right,oper); //中序遍历右子树/
     }
     return;
}
void BinTree_LRD(ChainBinTree *bt,void (*oper)(ChainBinTree *p)) //后序遍历
{
     if(bt)
     {
         BinTree_LRD(bt->left,oper); //后序遍历左子树
         BinTree_LRD(bt->right,oper); //后序遍历右子树/
         oper(bt); //处理结点数据
     }
     return;
}

void oper(ChainBinTree *p) //操作二叉树结点数据
{
     printf("%c ",p->data); //输出数据
     return;
}

void BinTree_Level(ChainBinTree *bt,void (*oper)(ChainBinTree *p)) //按层遍历
{
     ChainBinTree *p;
     ChainBinTree *q[QUEUE_MAXSIZE]; //定义一个顺序栈
     int head=0,tail=0;//队首、队尾序号
     if(bt)//若队首指针不为空     
     {
         tail=(tail+1)%QUEUE_MAXSIZE;//计算循环队列队尾序号
         q[tail] = bt;//将二叉树根指针进队
     }
     while(head!=tail) //队列不为空,进行循环
     {
         head=(head+1)%QUEUE_MAXSIZE; //计算循环队列的队首序号
         p=q[head]; //获取队首元素
         oper(p);//处理队首元素
         if(p->left!=NULL) //若结点存在左子树,则左子树指针进队
         {
             tail=(tail+1)%QUEUE_MAXSIZE;//计算循环队列的队尾序号
             q[tail]=p->left;//将左子树指针进队
         }
                 
         if(p->right!=NULL)//若结点存在右孩子,则右孩子结点指针进队
         {
             tail=(tail+1)%QUEUE_MAXSIZE;//计算循环队列的队尾序号
             q[tail]=p->right;//将右子树指针进队
         }
     }
     return;
}
2010-11-03 13:12
快速回复:二叉树的递归递归遍历有错误?
数据加载中...
 
   



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

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