二叉树
来源:互联网 发布:手机测视力软件 编辑:程序博客网 时间:2024/05/16 08:51
练习题
根据输入构建一个二叉树。
输入
第一行为树的根结点,从第二行开始,每行有三个字符,第一个字符是第三个字符的父结点。中间字符为L时表示第三个字符是第一个字符的左子树,R表示右子树。输入以0结束。
输出
该二叉树的先、中、后和层次遍历,最后输出树的深度。
#include<iostream>
#include<fstream>
#include<malloc.h>
#include<queue>
using namespace std;
ifstream stream("input.txt");
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode,*BiTree;
void findparentandCreate(BiTree &T,char parent,char ch,char child)
{
if(T) /* T不空 */
{
if(T->data != parent)
{
findparentandCreate(T->lchild,parent,ch,child);
findparentandCreate(T->rchild,parent,ch,child);
}
else
{
switch(ch){
case 'l':
case 'L':
T->lchild=(BiTree)malloc(sizeof(BiTNode));
if(!T->lchild)
exit(1);
T->lchild->data=child; /* 生成根结点 */
T->lchild->lchild = NULL;
T->lchild->rchild = NULL;
return;
case 'r':
case 'R':
T->rchild=(BiTree)malloc(sizeof(BiTNode));
if(!T)
exit(1);
T->rchild->data=child; /* 生成根结点 */
T->rchild->lchild = NULL;
T->rchild->rchild = NULL;
return;
}
}
}
}
void CreateBiTree(BiTree &T)// *T = t
{
char parent,ch,child;
T=(BiTree)malloc(sizeof(BiTNode));
stream>>T->data; /* 生成根结点 */
T->lchild = NULL;
T->rchild = NULL;
while(stream>>parent&&!stream.eof())
{
if(parent!='0')
{
stream>>ch>>child;
findparentandCreate(T,parent,ch,child);
}//if
else{ return ;}
}//while
}
void PreOrderTraverse(BiTree T)
{
if(T) /* T不空 */
{
cout<<T->data;
PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */
PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */
}
}
void InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->lchild); /* 先中序遍历左子树 */
cout<<T->data; /* 再访问根结点 */
InOrderTraverse(T->rchild); /* 最后中序遍历右子树 */
}
}
void PostOrderTraverse(BiTree T)
{
if(T) /* T不空 */
{
PostOrderTraverse(T->lchild); /* 先后序遍历左子树 */
PostOrderTraverse(T->rchild); /* 再后序遍历右子树 */
cout<<T->data; /* 最后访问根结点 */
}
}
void LevelOrderTraverse(BiTree T)
{
queue<BiTree>q;
BiTree a;
if(T)
{
q.push(T);
while(!q.empty())
{
a=q.front();
q.pop();
cout<<a->data;
if(a->lchild!=NULL)
q.push(a->lchild);
if(a->rchild!=NULL)
q.push(a->rchild);
}
printf("/n");
}
}
int BiTreeDepth(BiTree T)
{ /* 初始条件: 二叉树T存在。操作结果: 返回T的深度 */
int hl=0,hr=0,max=0;
if(T!=NULL)
{ hl=BiTreeDepth(T->lchild);
hr=BiTreeDepth(T->rchild);
max=hl>hr?hl:hr;
return max+1;
}
else{ return 0;}
}
void main()
{
BiTree T;
CreateBiTree(T);
PreOrderTraverse(T);
cout<<endl;
InOrderTraverse(T);
cout<<endl;
PostOrderTraverse(T);
cout<<endl;
LevelOrderTraverse(T);
int depth=BiTreeDepth(T);
cout<<depth-1 <<endl;
}
输入样例 输出样例
A ABDGCEHFI
A L B DGBAHECFI
A R C GDBHEIFCA
B L D ABCDEFGHI
D R G 3
C L E
C R F
E L H
F R I
0
- 二叉树、二叉堆
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 基础知识:MySQL数据类型及列类型 (1)
- Swing 模型过滤
- .net 自动产生的JavaScript代码
- c3p0Tomcat JDBC -- mysql连接数据库连接池.doc
- 化解字符串不能超过8000的方法(ZT)
- 二叉树
- 最新最全JDK 下载地址
- 25 个在 Web 中嵌入图表的免费资源
- 如何卸载 IE
- 一个jdk的安装错误提示,第一次遇到,查了老半天也不知道为啥???有人见过吗???
- 博弈算法之alpha-beta搜索
- ASP.NET页面事件:顺序与回传详解
- oracle10g、11g的安装步骤
- Gridview导出excel