数据结构上机 【创建二叉树,并采用先中后序遍历,输出树高,度数为分别为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; }