怎么用递归建立二叉树????

guotyro 2004-10-28 09:12:56
#include "stdio.h"
#include "stdlib.h"

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


int CreateBiTree(BiTNode *T);//利用递归遍历建立二叉树的存储结构
void PreOrder(BiTNode *T);//用先序遍历打印二叉树
int main()
{
BiTNode T;
CreateBiTree(&T);
PreOrder(&T);
return 1;
}

int CreateBiTree(BiTNode *T)
{
char ch;
scanf("%c",&ch);
if(ch==' ')T=NULL;
else{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))return 0;
T->data =ch;
CreateBiTree(T->lchild );//形参是个指针,实参也是个指针,
CreateBiTree(T->rchild );
}
return 1;

}
void PreOrder(BiTNode *T)
{
if(T){
printf("%2c",T->data );
PreOrder(T->lchild );
PreOrder(T->rchild );
}
}

为何这样建立的二叉树的每个结点之间是独立的,CreateBiTree(T->lchild )的递归调用的参数有无问题??这里好象有一个实参是指针,形参也是指针,在被调用函数里对指针的修改并不能返回到调用函数
...全文
225 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangfjj 2004-10-28
  • 打赏
  • 举报
回复
看看我以前写的。

#include <stdio.h>
#include <malloc.h>
#define max 100

typedef char elementype;
typedef struct node
{
elementype data;
struct node *lchild,*rchild;
}lbtree;
A
/ \
B C
\ / \
D E F
要建立如上图的二叉树,如果用下面的前序遍历递归算法,要增加若干虚结点,输入时应为:
A
/ \
B C
/ \ / \
# D E F
/ \
# # (不能用图,在E和F结点下各有两个虚结点。)所以在输入时应该:

A B # D # # C E # # F # #
其算法如下
//按前序遍历递归算法生成二叉树,用'#'表示虚结点
//可仿照写出中序或后序遍历递归算法生成二叉树
lbtree *create()
{
//输入数据时应按前序遍历顺序
lbtree *root;
char ch;
ch=getchar();
getchar();
if(ch=='#')
{
root=NULL;
}
else
{
printf("this node is %c\n",ch);
root=(lbtree *)malloc(sizeof(lbtree));
root->data=ch;
root->lchild=create();//生成左子二叉树
root->rchild=create();//生成右子二叉树
}
return root;
}
用非递归算法生成二叉树,要把该二叉树补成完全二叉树,并按层次顺序输入数据:
A
/ \
B C
/ \ / \
$ D E F

A B C $ D E F # (用$表示虚结点,#表示输入结束)
//非递归算法生成二叉树
lbtree *qcreate()
{
//输入数据时按完全二叉树的顺序,
//用'$'表示虚结点,'#'表示输入数据结束
lbtree * queue[max],*p,*root;
int front=0,rear=0;
char ch;
root=NULL;
ch=getchar();
getchar();
while(ch!='#')
{
p=NULL;
if(ch!='$')
{
p=(lbtree *)malloc(sizeof(lbtree));
p->data=ch;
p->lchild=NULL;
p->rchild=NULL;
}
rear++;
queue[rear]=p;//入队列
if(queue[front+1]!=NULL&&p!=NULL)//双亲结点和子结点都不为空
{
if(rear==1)//根结点
root=p;
else
{
if(rear%2==0)
queue[front+1]->lchild=p;//左结点
else
queue[front+1]->rchild=p;//右结点
if(rear%2==1)
front++;//出队列
}
}
ch=getchar();
getchar();
}
return root;
}


69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧