输出树形结构的二叉树
2017-12-17 21:57
302 查看
输入:ABC##DE#G##F###
输入所表示的二叉树
A
/
B
/ \
C D
/ \
E F
\
G
#include<iostream>
#include<cstdlib>
#include<cstdio>
#define MaxSize 1000
using namespace std;
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
int layer;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
struct Queue
{
BiTree *data;
int front,rear,size;
}q;
void push(BiTree T)
{
q.data[q.rear++]=T;
if(q.rear>=q.size)
{
cout<<"no space"<<endl;
exit(-1);
}
}
BiTree pop()
{
if(q.front>=q.rear)
{
cout<<"error"<<endl;
exit(-1);
}
return q.data[q.front++];
}
bool empty()
{
if(q.front>=q.rear)
return 1;
return 0;
}
int Max(int x,int y)
{
return (x>y)?x:y;
}
void CreatBiTree(BiTree &T)
{
char ch;
cin>>ch;
if(ch=='#')
{
T=NULL;
return ;
}
T= new BiTNode;
if(!T)
{
cout<<"no space"<<endl;
exit(-1);
}
T->data=ch;
T->lchild=NULL;
T->rchild=NULL;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
int CountDeepth(BiTree T)
{
if(!T)
return 0;
return Max(CountDeepth(T->lchild),CountDeepth(T->rchild))+1;
}
void PrintTree(BiTree T,int deepth)
{
int pre=0,flag=1;
q.data=(BiTree*)malloc(MaxSize*sizeof(BiTree));
q.front=q.rear=0;
q.size=MaxSize;
T->layer=0;
push(T);
while(1)
{
BiTree node=pop();
if(node->layer>=deepth)
break;
if(pre!=node->layer||flag)
{
cout<<endl;
for(int i=1;i<(1<<(deepth-node->layer));i++)
cout<<' ';
cout<<node->data;
pre=node->layer;
flag=0;
}
else
{
for(int i=1;i<(1<<(deepth-node->layer+1));i++)
cout<<' ';
cout<<node->data;
}
if(node->lchild)
{
node->lchild->layer=node->layer+1;
push(node->lchild);
}
else
{
BiTree node_null=(BiTree)malloc(sizeof(BiTNode));
node_null->layer=node->layer+1;
node_null->lchild=node_null->rchild=NULL;
node_null->data=' ';
push(node_null);
}
if(node->rchild)
{
node->rchild->layer=node->layer+1;
push(node->rchild);
}
else
{
BiTree node_null=(BiTree)malloc(sizeof(BiTNode));
node_null->layer=node->layer+1;
node_null->lchild=node_null->rchild=NULL;
node_null->data=' ';
push(node_null);
}
}
}
void preorder(BiTree T)
{
if(!T)
return ;
cout<<T->data;
preorder(T->lchild);
preorder(T->rchild);
}
void inorder(BiTree T)
{
if(!T)
return ;
inorder(T->lchild);
cout<<T->data;
inorder(T->rchild);
}
void postorder(BiTree T)
{
if(!T)
return ;
postorder(T->lchild);
postorder(T->rchild);
cout<<T->data;
}
int main()
{
int deepth;
BiTree root=NULL;
CreatBiTree(root);
deepth=CountDeepth(root);
PrintTree(root,deepth);
cout<<endl<<"深度: "<<deepth<<endl;
cout<<"前序: ";
preorder(root);
cout<<endl<<"中序: ";
inorder(root);
cout<<endl<<"后序: ";
postorder(root);
cout<<endl;
return 0;
}输出:
ABC##DE#G##F###
A
B
C D
E F
G
深度: 5
前序: ABCDEGF
中序: CBEGDFA
后序: CGEFDBA
--------------------------------
Process exited after 6.867 seconds with return value 0
请按任意键继续. . .
c26e
输入所表示的二叉树
A
/
B
/ \
C D
/ \
E F
\
G
#include<iostream>
#include<cstdlib>
#include<cstdio>
#define MaxSize 1000
using namespace std;
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
int layer;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
struct Queue
{
BiTree *data;
int front,rear,size;
}q;
void push(BiTree T)
{
q.data[q.rear++]=T;
if(q.rear>=q.size)
{
cout<<"no space"<<endl;
exit(-1);
}
}
BiTree pop()
{
if(q.front>=q.rear)
{
cout<<"error"<<endl;
exit(-1);
}
return q.data[q.front++];
}
bool empty()
{
if(q.front>=q.rear)
return 1;
return 0;
}
int Max(int x,int y)
{
return (x>y)?x:y;
}
void CreatBiTree(BiTree &T)
{
char ch;
cin>>ch;
if(ch=='#')
{
T=NULL;
return ;
}
T= new BiTNode;
if(!T)
{
cout<<"no space"<<endl;
exit(-1);
}
T->data=ch;
T->lchild=NULL;
T->rchild=NULL;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
int CountDeepth(BiTree T)
{
if(!T)
return 0;
return Max(CountDeepth(T->lchild),CountDeepth(T->rchild))+1;
}
void PrintTree(BiTree T,int deepth)
{
int pre=0,flag=1;
q.data=(BiTree*)malloc(MaxSize*sizeof(BiTree));
q.front=q.rear=0;
q.size=MaxSize;
T->layer=0;
push(T);
while(1)
{
BiTree node=pop();
if(node->layer>=deepth)
break;
if(pre!=node->layer||flag)
{
cout<<endl;
for(int i=1;i<(1<<(deepth-node->layer));i++)
cout<<' ';
cout<<node->data;
pre=node->layer;
flag=0;
}
else
{
for(int i=1;i<(1<<(deepth-node->layer+1));i++)
cout<<' ';
cout<<node->data;
}
if(node->lchild)
{
node->lchild->layer=node->layer+1;
push(node->lchild);
}
else
{
BiTree node_null=(BiTree)malloc(sizeof(BiTNode));
node_null->layer=node->layer+1;
node_null->lchild=node_null->rchild=NULL;
node_null->data=' ';
push(node_null);
}
if(node->rchild)
{
node->rchild->layer=node->layer+1;
push(node->rchild);
}
else
{
BiTree node_null=(BiTree)malloc(sizeof(BiTNode));
node_null->layer=node->layer+1;
node_null->lchild=node_null->rchild=NULL;
node_null->data=' ';
push(node_null);
}
}
}
void preorder(BiTree T)
{
if(!T)
return ;
cout<<T->data;
preorder(T->lchild);
preorder(T->rchild);
}
void inorder(BiTree T)
{
if(!T)
return ;
inorder(T->lchild);
cout<<T->data;
inorder(T->rchild);
}
void postorder(BiTree T)
{
if(!T)
return ;
postorder(T->lchild);
postorder(T->rchild);
cout<<T->data;
}
int main()
{
int deepth;
BiTree root=NULL;
CreatBiTree(root);
deepth=CountDeepth(root);
PrintTree(root,deepth);
cout<<endl<<"深度: "<<deepth<<endl;
cout<<"前序: ";
preorder(root);
cout<<endl<<"中序: ";
inorder(root);
cout<<endl<<"后序: ";
postorder(root);
cout<<endl;
return 0;
}输出:
ABC##DE#G##F###
A
B
C D
E F
G
深度: 5
前序: ABCDEGF
中序: CBEGDFA
后序: CGEFDBA
--------------------------------
Process exited after 6.867 seconds with return value 0
请按任意键继续. . .
c26e
相关文章推荐
- 数据结构学习笔记(三) 树形结构之二叉树的前、中、后序遍历递归方法
- 二叉树遍历线索化及树形结构输出
- 【IO面试题】打印目录树形结构,并输出到file.txt中
- thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
- 数据结构学习笔记(三) 树形结构之对称序线索化二叉树
- Atitit 常见的树形结构 红黑树 二叉树 B树 B+树 Trie树 attilax理解与总结
- 数据结构—二叉树的创建 遍历 输出
- 【小程序】递归实现控制台输出的文件树形结构
- 数据结构_树形结构_二叉树
- 数据结构(C语言实现) - 二叉树的基本操作(建立,遍历,结点数,叶子结点数,高度,按树状打印,输出叶子结点等)
- java学习笔记 使用递归 将文件目录树形结构输出,递归删除目录 文件夹。
- 将二叉树PreOrder, inOrder序列化后,再恢复树形结构
- Linux文件系统调用----实现对树形文件结构的广度优先遍历,即按层输出文件信息
- java遍历给定目录,树形结构输出所有文件,包括子目录中的文件
- 组合模式:输出树形结构
- Java遍历输出指定目录、树形结构所有文件包括子目录下的文件
- 建一棵二叉树,能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立二叉树存储结构的的输入函数、输出层序遍历序列的函数、输出先序遍历序列的函数
- java遍历给定目录,树形结构输出所有文件,包括子目录中的文件
- 输出目录下的文件树形结构
- 【数据结构与算法学习笔记】PART4 树形结构(二叉树,堆)