二叉树的基本构造及遍历方法
2015-10-17 16:38
260 查看
#include<stdio.h> #include<stdlib.h> #include<stack> #include<queue> using namespace std; typedef struct node { char data; struct node *Lchild; struct node *Rchild; }Bt_Tree,*Tree; void Init_Tree(Tree &tree) { char ch; scanf("%c",&ch); if(ch!='#') { tree=(Tree)malloc(sizeof(Bt_Tree)); tree->data=ch; Init_Tree(tree->Lchild); Init_Tree(tree->Rchild); } else tree=NULL; } void For_Sce_Init(Tree &tree,char *pre,char *sec,int len) { char *temp; if(len<=0) { tree=NULL; return ; } int flag; tree=(Tree)malloc(sizeof(Bt_Tree)); tree->data=pre[0]; for(temp=sec;temp<sec+len;temp++) { if(*temp==*pre) break; } flag=temp-sec; For_Sce_Init(tree->Lchild,pre+1,sec,flag); For_Sce_Init(tree->Rchild,pre+1+flag,sec+flag+1,len-flag-1); } void Sce_End_Init(Tree &tree,char *sce,char *end,int len) { char *temp; int flag; if(len<=0) { tree=NULL; return ; } tree=(Tree)malloc(sizeof(Bt_Tree)); tree->data=*(end+len-1); for(temp=sce;temp<sce+len;temp++) { if(*temp==*(end+len-1)) break; } flag=temp-sce; Sce_End_Init(tree->Lchild,sce,end,flag); Sce_End_Init(tree->Rchild,sce+flag+1,end+flag,len-flag-1); } void Force_Travel(Tree tree) { if(tree) { printf("%c ",tree->data); Force_Travel(tree->Lchild); Force_Travel(tree->Rchild); } } void Sceond_Travel(Tree tree) { if(tree) { Sceond_Travel(tree->Lchild); printf("%c ",tree->data); Sceond_Travel(tree->Rchild); } } void End_Travel(Tree tree) { if(tree) { End_Travel(tree->Lchild); End_Travel(tree->Rchild); printf("%c ",tree->data); } } void Un_Force_Travel(Tree tree) { stack<Tree>S; Tree p,c; p=tree; while(p||!S.empty()) { if(p) { S.push(p); c=S.top(); printf("%c",c->data); p=p->Lchild; } else { p=S.top(); p=p->Rchild; S.pop(); } } } void Un_Sceond_Travel(Tree tree) { stack<Tree>S; Tree p,c; p=tree; while(p||!S.empty()) { if(p) { S.push(p); p=p->Lchild; } else { c=S.top(); printf("%c",c->data); S.pop(); p=c->Rchild; } } } void Un_End_Travel(Tree tree) { stack<Tree>S; Tree p,c,x; p=tree; while(p||!S.empty()) { while(p) { S.push(p); p=p->Lchild; } c=S.top(); if(!c->Rchild) { printf("%c",c->data); S.pop(); } else { p=c->Rchild; x=S.top(); x->Rchild=NULL; } } } void Levels_Travel(Tree tree) { queue<Tree>Q; Tree p,c,q; p=tree; Q.push(p); while(!Q.empty()) { c=Q.front(); printf("%c ",c->data); Q.pop(); q=c; if(c->Lchild) {Q.push(c->Lchild);} if(q->Rchild) {Q.push(q->Rchild);} } } void count_node_leaves(Tree tree) { int nodes=0,leaves=0; queue<Tree>Q; Tree p,c; p=tree; Q.push(p); while(!Q.empty()) { c=Q.front(); Q.pop(); nodes++; if(!c->Lchild&&!c->Rchild) leaves++; if(c->Lchild) Q.push(c->Lchild); if(c->Rchild) Q.push(c->Rchild); } printf("节点数 %d 叶子数 %d",nodes,leaves); } int main() { int c; int i,j; Tree tree; printf("输入完全二叉树的先序序列,用#代表虚结点(空指针):1\n"); printf("已知二叉树的先序遍历序列和中序遍历序列,建立二叉树的二叉链表。:2\n"); printf("已知二叉树的中序遍历序列和后序遍历序列,建立二叉树的二叉链表。:3\n"); scanf("%d",&c); switch(c) { case 1: { //Tree tree; Init_Tree(tree); break; } case 2: { //Tree tree; char pre[10],sce[10]; int len=7; scanf("%s",pre); scanf("%s",sce); For_Sce_Init(tree,pre,sce,len); break; } case 3: { //Tree tree; char sce[10],end[10]; int len=7; scanf("%s",sce); scanf("%s",end); Sce_End_Init(tree,sce,end,len); break; } } printf("递归先序遍历结果:\n"); Force_Travel(tree); putchar('\n'); printf("递归中序遍历结果:\n"); Sceond_Travel(tree); putchar('\n'); printf("递归后序遍历结果:\n"); End_Travel(tree); putchar('\n'); printf("非递归先序遍历结果:\n"); Un_Force_Travel(tree); putchar('\n'); printf("非递归中序遍历结果:\n"); Un_Sceond_Travel(tree); putchar('\n'); // printf("非递归后序遍历结果:\n"); // Un_End_Travel(tree); // putchar('\n'); printf("层次遍历结果:\n"); Levels_Travel(tree); putchar('\n'); count_node_leaves(tree); return 0; }
相关文章推荐
- 利用canvas画rect画出条形统计图
- 明年计划
- 深度学习——历史及意义
- 水仙花数(笨办法)
- JNI中查找类,访问类的域
- 四大组件(Service)
- IOS开发:NSUserDefaults
- 【转】 [置顶] Scrapy研究探索(七)——如何防止被ban之策略大集合
- lintcode :最长单词
- WF构造函数2
- Node.js代码总结
- 数据进入协议栈的封装过程
- java基础回顾----java基本数据类型及变量
- java_selenium 开发环境搭建
- javac操作方法
- Ubuntu下安装eclipse
- nyoj 983首尾相连数组的最大子数组和
- 软件开发中,做产品与做项目有什么区别?
- Mac上无法安装jekyll
- 解决resignFirstResponder或者endEditing无效的办法