C语言二叉树的创建和遍历

进行二叉树的先序创建和先序遍历~
#define NULL 0

#include<stdio.h>
typedef struct
{
char c;
struct tree *lchild,*rchild;
}tree;
tree *t1,tn;

void creat(tree *t1)
{
char ch;
struct node *th;

ch=getchar();

if(ch=='.') t1=NULL;
else

{ printf("%c",t1->c);
th=(tree *)malloc(sizeof(tree));
th->c=ch;
creat(th->lchild);
creat(th->rchild);
}

}
void reaserch()
{
tree *p,s[100];
int top=0;
p=t1;
while(p!=NULL||top!=0)
{
printf("gffd");
while(p!=NULL)
{
printf("%c",p->c);
s[top++]=*p;
p=p->lchild;
}
*p=s[--top];
p=p->rchild;

}
}

int main()
{

creat(t1);
reaserch();
getch();
return 0;
}
输入ab..c..
为什么没有任何反应!!!!!

我写了一个二叉树 你给看看 一定能行的 我自己用了
#include "stdio.h"
#include "malloc.h"
#include "string.h"
#include "stdlib.h"
#define Max 20 //结点的最大个数
typedef struct BinTNode{
char data;
struct BinTNode *lchild,*rchild;
}BinTNode,*BinTree; //自定义二叉树的结点类型
//定义二叉树的指针
int NodeNum,leaf; //NodeNum为结点数,leaf为叶子数

//==========以广义表显示二叉树==============
void DisTree(BinTree T)
{
if(T)
{
printf("%c",T->data);
if((T->lchild)||(T->rchild))
{
if(T->lchild)
{
printf("%c",'(');
DisTree(T->lchild);
}
if(T->rchild)
{
printf("%c",',');
DisTree(T->rchild);
printf("%c",')');
}
}
}
}
//==========基于先序遍历算法创建二叉树==============
//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置==========
BinTree CreatBinTree(BinTree T)
{
char ch;
ch=getchar();
if(ch=='#')
T=NULL;
else
{
if(!(T=(BinTNode *)malloc(sizeof(BinTNode))))
printf("Error!");
T->data=ch;
T->lchild=CreatBinTree(T->lchild);
T->rchild=CreatBinTree(T->rchild);
}
return T;
}
//========NLR 先序遍历=============
void Preorder(BinTree T)
{
if(T)
{
printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
//========LNR 中序遍历===============
void Inorder(BinTree T)
{
if(T){
Inorder(T->lchild);
printf("%c",T->data);
Inorder(T->rchild);
}
}
//==========LRN 后序遍历============
void Postorder(BinTree T)
{
if(T){
Postorder(T->lchild);
Postorder(T->rchild);
printf("%c",T->data);
}
}
//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法========
int TreeDepth(BinTree T)
{
int hl,hr,max;
if(T){
hl=TreeDepth(T->lchild); //求左深度
hr=TreeDepth(T->rchild); //求右深度
max=hl>hr? hl:hr; //取左右深度的最大值
NodeNum=NodeNum+1; //求结点数
if(hl==0&&hr==0)
leaf=leaf+1; //若左右深度为0,即为叶子。
return(max+1);
}
else return(0);
}
//====利用"先进先出"(FIFO)队列,按层次遍历二叉树==========
void Levelorder(BinTree T)
{
int front=0,rear=1;
BinTNode *cq[Max],*p; //定义结点的指针数组cq
cq[1]=T; //根入队
while(front!=rear)
{
front=(front+1)%NodeNum;
p=cq[front]; //出队
printf("%c",p->data); //出队,输出结点的值
if(p->lchild!=NULL){
rear=(rear+1)%NodeNum;
cq[rear]=p->lchild; //左子树入队
}
if(p->rchild!=NULL){
rear=(rear+1)%NodeNum;
cq[rear]=p->rchild; //右子树入队
}
}
}
//==========主函数=================
void main()
{
BinTree T,root;
int i,depth;
printf("\n");
printf("输入完全二叉树的先序序列:"); //输入完全二叉树的先序序列,
// 用#代表虚结点,如ABD###CE##F##
root=CreatBinTree(T); //创建二叉树,返回根结点
DisTree(root);
printf("\n");
do //从菜单中选择遍历方式,输入序号。
{
printf("\t********** 菜单 ************\n");
printf("\n");
printf("\t1: 先序遍历\n");
printf("\t2: 中序遍历\n");
printf("\t3: 后序遍历\n");
printf("\t4: 该树的深度,结点数,叶子数\n");
printf("\t5: 层次遍历\n"); //按层次遍历之前,先选择4,求出该树的结点数。
printf("\t0: 退出\n");
printf("\t*******************************\n");
scanf("%d",&i);
//输入菜单序号(0-5)
switch(i)
{
case 1: {printf("Print Bin_tree Preorder: ");
Preorder(root); //先序遍历
}break;
case 2: {printf("Print Bin_Tree Inorder: ");
Inorder(root); //中序遍历
}break;
case 3: {printf("Print Bin_Tree Postorder: ");
Postorder(root); //后序遍历
}break;
case 4: {depth=TreeDepth(root); //求树的深度及叶子数
printf("树深=%d 树总结点数=%d",depth,NodeNum);
printf(" 树叶子数=%d",leaf);
}break;
case 5: {printf("LevePrint Bin_Tree: ");
Levelorder(root); //按层次遍历
}break;
default: exit(1);
}
}while(i>=0&&i<6);
}

兄弟你看看 不懂再往下留言 记得给我的劳动成果一点点奖励哦!!
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-11-08
void creat(tree *t1)
{
char ch;
struct node *th; //看到这个th了吗?不需要的

ch=getchar();

if(ch=='.') t1=NULL;
else

{
th=(tree *)malloc(sizeof(tree)); //改成t1=(tree *)malloc(sizeof(tree));
t1->c=ch;
printf("%c",t1->c);
creat(t1->lchild);
creat(t1->rchild);
}

二叉树先序非递归遍历C语言算法
printf("先序非递归建立一个二叉树:"); if((ht=createprebitree())!=NULL) \/\/非递归建立 \/\/CreateBiTree(&ht); \/\/if(ht!=NULL) \/\/递归建立 { printf("先序遍历输出二叉树:"); preordertraverse(ht); putchar('\\n'); printf("中序遍历输出二叉树:"); inordertraverse(ht); putchar('\\n')...

c语言 关于二叉树的创建和遍历(中序遍历)
InitBtree(BT);\/\/初始化二叉树 CreateBiTree(BT,string);\/\/创建二叉树 printf("\\n中序遍历二叉树顺序为: ");inorder(BT);\/\/中序遍历二叉树 printf("\\n");}

...完成二叉树的建立,先序中序后序遍历的操作,求所有叶子结点总数_百度...
void print1(TLNode Tree){ \/\/先序遍历 if(Tree!=NULL){ printf("%d-",Tree->data);print1(Tree->lchild);print1(Tree->rchild);} } void print2(TLNode Tree){ \/\/中序遍历 if(Tree!=NULL){ print2(Tree->lchild);printf("%d-",Tree->data);print2(Tree->rchild);} } void...

请问C语言如何创建二叉树???
Tree tree;tree.root = NULL;\/\/创建一个空树 int n;scanf("%d",&n);for (int i = 0; i < n; i++)\/\/输入n个数并创建这个树 { int temp;scanf("%d",&temp);insert(&tree, temp);} inorder(tree.root);\/\/中序遍历 getchar();getchar();return 0;} ...

用C语言建立一棵二叉树,使用二杈链表存储,对其进行后续遍历,输出后序...
printf("%c",b->data);if(b->lchild!=NULL||b->rchild!=NULL){ printf("(");DispBTNode(b->lchild);if(b->rchild!=NULL)printf(",");DispBTNode(b->rchild);printf(")");} } } BTNode *FindNode(BTNode *b,char x){ BTNode *p=NULL;if(b==NULL){ return NULL;} else if...

二叉树中序遍历的序列是什么?
前序遍历的结点序列是:BEFCGDH;中序遍历的结点序列是:FEBGCHD;后序遍历的结点序列是:FEGHDCB。前序遍历首先访问根结点然后遍历左子树,最后遍历右子树;序遍历首先遍历左子树,然后访问根结点,最后遍历右子树;后序遍历先左后右再根,即首先遍历左子树,然后遍历右子树,最后访问根结点。

...并对得到的二叉排序述进行中序遍历,得到有序序列。
void inorder(BiTNode *BT){\/\/中序遍历二叉树 if(BT!=NULL){ inorder(BT->lchild );printf("%c ",BT->data);inorder(BT->rchild );} } void DeleteBtree(BiTNode *BT){\/\/删除二叉树的所有的节点 if(BT!=NULL){ DeleteBtree(BT->lchild );DeleteBtree(BT->rchild );free(BT);} }...

c语言二叉树问题,勿写代码,求详细思考过程
中序遍历:若树不空,则先访问左子树,再访问根,再访问右子树。从后序遍历:CDABE得出E是最顶根节点。然后中序遍历:CADEB得出CAD是E的左子树中的,B是E的右子树中的。再分析后序遍历CDA可以知道A是CD的根,而中序是CAD得到C是A的左子树,D是A的右子树。(如下图)最后,先序遍历:若树...

求二叉树的前序遍历和后序遍历的算法(非递归)
\/\/先序遍历非递归算法 void PreOrderUnrec(Bitree *t){ Stack s; StackInit(s); \/\/初始化 Bitree *p=t; \/\/ 二叉树根节点 while (p!=NULL || !StackEmpty(s)) { while (p!=NULL) \/\/遍历左子树 { visite(p->data); push(s,p); p=p-...

用C语言实现二叉排序树排序,并按递减顺序打印各个数据
return bt; \/\/返回建立的二叉排序树的根指针 } void DispInDescrease(BSTNode *bt){ \/\/按从小到大输出查找树中的内容,对该树中序遍历即可 if(bt){ DispInDescrease(bt->lchild);printf("%d\\t",bt->key);DispInDescrease(bt->rchild);} } void main(){ BSTNode *bt,*p,*f;int...

相似回答