-
Notifications
You must be signed in to change notification settings - Fork 0
/
btree.cpp
147 lines (140 loc) · 4.11 KB
/
btree.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include<iostream>
using namespace std;
// 二叉树类型的定义(二叉链表形式储存)
typedef char datatype; // 树的结点数据类型为字符型,可以根据需要修改
typedef struct node *pointer; // 定义二叉树结点类型
struct node {
datatype data; //结点数据
pointer lchild,rchild; //左右孩子结点
};
typedef pointer bitree; //定义二叉树类型
//先根遍历交换左右子树
// 层次遍历序列生成
const int maxsize=100;
pointer Q[maxsize+1];
bitree level_creat() //由层次序列建立二叉树,返回根指针
{
char ch;
int front,rear;
pointer root,s;
root=NULL; //置空二叉树
front=rear=0; //置空队列
while(cin>>ch,ch!='#')
{
if(ch!='@') //非虚结点,建立新结点
{
s=new node;
s->data=ch;
s->lchild=s->rchild=NULL;
}
else s=NULL;
rear++;
Q[rear]=s; //不管结点是否为虚都要入队
if(rear==1)
{
root=s;
front=1;
} //第一个点是根,要修改头指针,他不是孩子
else if(s && Q[front]) //孩子和双亲都不是虚结点
if(rear%2==0)
Q[front]->lchild=s; // rear是偶数,新结点是左孩子
else
{
Q[front]->rchild=s; //rear 是奇数,新结点是右孩子
front++;
}
}
return root;
}
// 交换左右子数
void exchange(bitree t)
{
pointer p;
if(t==NULL)
return; //空树,直接返回
p=t->lchild;
t->lchild=t->rchild;
t->rchild=p; //交换
exchange(t->rchild); //遍历原左子树
exchange(t->lchild); //遍历原右子树
}
// 二叉树的先根遍历
void preorder(bitree t) //先根遍历
{
if(t==NULL)
return;
cout<<t->data<<" "; //先访问跟
preorder(t->lchild); //先根遍历左子树
preorder(t->rchild); //先根遍历右子树
}
// 二叉树的中序遍历
void midorder(bitree t) //中序遍历
{
if(t==NULL)
return;
midorder(t->lchild); //先根遍历左子树
cout<<t->data<<" "; //先访问跟
midorder(t->rchild); //先根遍历右子树
}
// 二叉树的后序遍历
void behorder(bitree t) //后序遍历
{
if(t==NULL)
return;
behorder(t->lchild); //先根遍历左子树
behorder(t->rchild); //先根遍历右子树
cout<<t->data<<" "; //先访问跟
}
void main()
{
bitree T=NULL;
int ch;
cout<<"首先层次遍历序列生成二叉树,请输入结点数据(输入'@'为虚结点,输入'#'结束):\n";
T=level_creat();
if(T==NULL)
cout<<"二叉树生成失败!\n";
else cout<<"二叉树生成成功!\n";
AA: do{
cout<<" \t\t----------------------菜单--------------------\n"
<<" \t\t\t\t0.退出\n"
<<" \t\t\t\t1.重新建立二叉树\n"
<<" \t\t\t\t2.交换左右子数\n"
<<" \t\t\t\t3.前序遍历二叉树\n"
<<" \t\t\t\t4.中序遍历二叉树\n"
<<" \t\t\t\t5.后序遍历二叉树\n"
<<" \t\t----------------------------------------------\n";
cout<<" 请选择:";
cin>>ch;
system("cls");
switch(ch)
{
case 0:
break;
case 1:
T=level_creat();
cout<<"二叉树生成成功!\n";
break;
case 2:
exchange(T);
cout<<" 交换成功!\n";
break;
case 3:
cout<<"前序遍历的结果为:";
preorder(T);
cout<<endl;
break;
case 4:
cout<<"中序遍历的结果为:";
midorder(T);
cout<<endl;
break;
case 5:
cout<<"后序遍历的结果为:";
behorder(T);
cout<<endl;
break;
default: cout<<"您输入错误!请重新输入"; goto AA;
}
}
while(ch!=0);
}