您的位置:首页 > 理论基础 > 数据结构算法

数据结构上机 【创建二叉树,并采用先中后序遍历,输出树高,度数为分别为0 1 2 的结点个数】

2015-11-27 18:07 375 查看
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<malloc.h>
#define null 0
using namespace std;
typedef struct node
{
int data;//节点
node *lchild,*rchild;
}node,*Tree;
typedef struct{
Tree top, base;
}Stack;
int sum0,sum1,sum2,Height;
Stack s;
void getstack(Stack &s)//构造一个空栈
{
s.base = (Tree)malloc(100*sizeof(node));
s.top = s.base;
}

int stackempty(Stack s)//判断栈是否为空
{
if(s.top==s.base)
return 0;
else
return 1;
}
void push(Stack &s, Tree e){//压栈
*s.top++ = *e;
}
void gettree(Tree &T)//创建二叉树
{
int point;
scanf("%d",&point);
if(point==null)
T=NULL;
else
{
T=(Tree)malloc(sizeof(node));
T->data=point;
gettree(T->lchild);
gettree(T->rchild);
}
}
void output(int e){
printf("%d ",e);
}
void PreOrderTraverse(Tree T)//先序遍历
{
if(T)
{
printf("%d ",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(Tree T)//中序遍历
{
getstack(s);
Tree p=T;
Tree Q=(Tree)malloc(sizeof(node));
while(p||stackempty(s))
{
if(p)
{
push(s,p);
p=p->lchild;
}
else
{
*Q = *--s.top;
output(Q->data);
p=Q->rchild;
}
}
}
void Degree(Tree T)//求度数分别为0  1  2的结点个数
{
if(T==NULL)
return ;
else
{
if(T->lchild&&T->rchild)
sum2++;
else if((T->lchild&&!T->rchild)||(!T->lchild&&T->rchild))
sum1++;
else if(!T->lchild&&!T->rchild)
sum0++;
Degree(T->lchild);
Degree(T->rchild);
}
}
int High(Tree T)//求树高
{
if(T==NULL)
return 0;
int num1=High(T->lchild);
int num2=High(T->rchild);
return max(num1,num2)+1;
}
void PostOrderTraverse(Tree T)//后序遍历
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%d ",T->data);
}
}
void checkTree(Tree T)//遍历整个树
{
Degree(T);
Height=High(T);
}
int main()
{
Tree T;
printf("按先序次序输入二叉树中结点的值,输入0表示节点为空,输入范例:1 2 0 0 3 0 0\n");
gettree(T);
printf("先序递归遍历二叉树:\n");
PreOrderTraverse(T);
printf("\n");
printf("中序递归遍历二叉树:\n");
InOrderTraverse(T);
printf("\n");
printf("后序递归遍历二叉树:\n");
PostOrderTraverse(T);
printf("\n\n");
sum1=sum0=sum2=0;
checkTree(T);
printf("这棵树中度为0的结点个数为%d\n\n",sum0);
printf("这棵树中度为1的结点个数为%d\n\n",sum1);
printf("这棵树中度为2的结点个数为%d\n\n",sum2);
printf("这棵树的高度为%d\n",Height);
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: