#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *lchild,*rchild;
}Node;
Node * CreatTree()//创建二叉树
{
Node *p;
int num;
scanf("%d",&num);
if(num==0)
{
p=NULL;
return 0;
}
else
{
p=(Node *)malloc(sizeof(Node));
if(!p)
return 0;
p->data=num;
printf("输入%d的左结点:",num);
p->lchild=CreatTree();
printf("输入%d的右结点:",num);
p->rchild=CreatTree();
}
return p;
}
void TravelTree1(Node *p)//先序遍历
{
if(p==NULL)
{
return ;
}
printf("%d ",p->data);
TravelTree1(p->lchild);
TravelTree1(p->rchild);
}
void TravelTree2(Node *p)//中序遍历
{
if(p==NULL)
{
return ;
}
TravelTree2(p->lchild);
printf("%d ",p->data);
TravelTree2(p->rchild);
}
void TravelTree3(Node *p)//后序遍历
{
if(p==NULL)
{
return;
}
TravelTree3(p->lchild);
TravelTree3(p->rchild);
printf("%d ",p->data);
}
void TravelTree4(Node *p)//非递归的中序遍历方法
{
Node *stack[100];//栈中存放地址
int top=-1;//栈顶指针
printf("非递归中序遍历如下:\n");
while(p||top!=-1)//top!=-1表示栈中的元素不为空,当top>=0时表示栈中有元素
{
while(p)//先把所有左树入栈
{
top++;
stack[top]=p;
p=p->lchild;
}
if(top!=-1)
{
p=stack[top];
top--;
printf("%d ",p->data);//输出节点数据
p=p->rchild;
}
}
printf("\n");
}
int Treedeep(Node *p)//树的高度
{
int deep=0,leftdeep=0,rightdeep=0;
if(p==NULL)
{
return 0;
}
leftdeep=Treedeep(p->lchild);
rightdeep=Treedeep(p->rchild);
if(rightdeep>=leftdeep)
return rightdeep+1;
else
return leftdeep+1;
}
int main()
{
int num=0;
Node *p,*p1;
printf("输入根结点数据(输入0代表结束):");
p=CreatTree();
printf("先序遍历二叉树:\n");
TravelTree1(p);
printf("\n");
printf("中序遍历二叉树:\n");
TravelTree2(p);
printf("\n");
printf("后序遍历二叉树:\n");
TravelTree3(p);
printf("\n");
num=Treedeep(p);
printf("树的高度:%d\n\n\n",num);
printf("输入头结点数据(输入0代表结束):");
p1=CreatTree();
TravelTree4(p1);
return 0;
}
C语言实现二叉树(创建,先序,中序,后序遍历的递归实现,以及非递归的中序遍历(栈),求树的高度)
最新推荐文章于 2023-10-21 01:34:13 发布