#include
#include
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("第一题:\n");
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("第二题:\n");
printf("输入头结点数据(输入0代表结束):");
p1=CreatTree();
TravelTree4(p1);
return 0;
}
标签:Node,遍历,return,递归,中序,num,printf,top
来源: https://blog.csdn.net/qq_41032474/article/details/89715318