1 #include <iostream>
2 using namespace std;
3 struct TreeNode //树结构体定义
4 {
5 char data;
6 TreeNode *lchild,*rchild;
7 };
8 char getonech(char ar[])
9 { static int i;
10 return ar[i++];
11 }
12 void CreateBiTree(TreeNode *&p,char ar[]) //建立一个新树
13 {
14 char ch;
15 ch=getonech(ar);
16 if(ch!='*')
17 {
18 p=new TreeNode;
19 p->data=ch;
20 CreateBiTree(p->lchild,ar);
21 CreateBiTree(p->rchild,ar);
22 }
23 else p=NULL;
24 }
25
26 void preorder(TreeNode *p) //前序遍历
27 {
28 if(p!=NULL)
29 {
30 cout<<p->data;
31 preorder(p->lchild);
32 preorder(p->rchild);
33 }
34 }
35
36 void inorder(TreeNode *p) //中序遍历
37 {
38 if (p)
39 {
40 inorder(p->lchild);
41 cout<<p->data;
42 inorder (p->rchild);
43 }
44 }
45
46 void aforder(TreeNode *p) //后序遍历
47 {
48 if (p)
49 {
50 aforder(p->lchild);
51 aforder(p->rchild);
52 cout<<p->data;
53 }
54 }
55
56 int countl(TreeNode *p) //计算树叶数量
57 {
58 static int m=0,n=0;
59 if(p) //树不空时
60 {
61 m++;
62
63 countl(p->lchild);
64 countl(p->rchild);
66 return m;
69 }
70
72 }
73 void change(TreeNode *p) //左右子树交换
74 {
75 TreeNode *r;
76 r=new TreeNode;
77 int f1=0,f2=0;
78 if(p==0) return ; //树为空时,跳出
79 if(p->lchild)
80 {
81 change(p->lchild);
82 r->lchild=p->lchild;
83 f1++; //有左叶子,符号位不为空
84 }
85 if(p->rchild)
86 {
87 change(p->rchild);
88 r->rchild=p->rchild;
89 f2++; //有右叶子,符号位不为空
90 }
91 if(f1==0) r->lchild=NULL; //否则,给中间变量赋空值
92 if(f2==0) r->rchild=NULL;
93 if(f1||f2)
94 {
95 p->rchild=r->lchild; //左右子树交换
96 p->lchild=r->rchild;
97 }
98 }
99
100 void main()
101 {
102 char *s;
103 s=new char[100];
104 cout<<"请以前序方式输入数据:"; //按要求输入数据,遇空子树输入*
105 cin>>s;
106 TreeNode *tree;
107 CreateBiTree(tree,s);
108 cout<<"前序遍历为:";
109 preorder(tree); //输出前序遍历结果
110 cout<<endl;
111 cout<<"中序遍历为:";
112 inorder(tree); //输出中序遍历结果
113 cout<<endl;
114 cout<<"后序遍历为:";
115 aforder(tree); //输出后序遍历结果
116 cout<<endl;
117 cout<<"叶子数为:"<<countl(tree)<<endl; //求出叶子数
118 cout<<"树高为:"<<counth(tree)<<endl; //求出树高
119 change(tree); //左右子树交换
120 cout<<"左右子树交换后的前序遍历为:";
121 preorder(tree); //输出交换后前序遍历结果
122 cout<<endl;
123 cout<<"左右子树交换后的中序遍历为:";
124 inorder(tree); //输出交换后中序遍历结果
125 cout<<endl;
126 }