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

#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;
}

  

posted @ 2015-11-27 18:07  非我非非我  阅读(342)  评论(0编辑  收藏  举报