数据结构上机 【创建二叉树,并采用先中后序遍历,输出树高,度数为分别为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; }
相关文章推荐
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- getchar,getch,scanf,gets,getche一群纠结的兄弟
- [数据结构JAVA版]集合
- 数据结构之内存---对和栈的区别
- 数据结构实验之图论七:驴友计划 最短路中最小花费
- 贪婪算法+小应用(调度问题)
- 《大话数据结构》之Kruskal算法
- 数据结构-使用数组作为环
- C#数据结构之队列(Quene)实例详解
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- PTA数据结构与算法题目集(中文) 函数题 (1)
- 数据结构和算法动态可视化
- 数据结构系列——Java后缀树实现代码
- 黑客攻击的入口--端口
- 数据结构系列——后缀树(附Java实现代码)
- 数据结构 — 树 与 二叉树、森林
- 【数据结构】 队列的应用举例——更好的学习和理解队列
- 数据结构——使用双端链表实现队列(java实现)