![]()
1 #include <stdio.h>
2 #include <stdlib.h>
3 /*本程序作为数据结构课程(使用教材“数据结构与算法分析-C语言描述”,M. A. Weiss著)关于二叉树部分的补充程序。*/
4 /*本程序使用纯 C 语言*/
5
6 typedef char ElementType;
7 typedef struct TreeNode {
8 ElementType Element;
9 struct TreeNode *Left;
10 struct TreeNode *Right;
11 } BTNode;
12
13 BTNode *CreateTree(BTNode *root)
14 {
15 //先序递归创建二叉树,
16 //输入范例:abd#g##e##cf#h###
17 /*
18 a
19 / \
20 / \
21 b c
22 / \ /
23 d e f
24 \ \
25 g h
26
27 */
28
29 //对应于: a(b(d(,g),e),c(f(,h),))
30 char ch;
31 scanf("%c",&ch);
32 if(ch=='#') {
33 //printf("--%c$$$\n",ch);
34 return NULL;
35 }
36 else
37 {
38 //printf("++%c***\n",ch);
39 root=(BTNode *)malloc(sizeof(BTNode));
40 root->Element=ch;
41 root->Left=CreateTree(root->Left);
42 root->Right=CreateTree(root->Right);
43 }
44 return root;
45 }
46
47 void PreOrder(BTNode *b) /*先序遍历的递归算法*/
48 {
49 if (b!=NULL) {
50 printf("%c ",b->Element); /*访问根结点*/
51 PreOrder(b->Left);
52 PreOrder(b->Right);
53 }
54 }
55
56 void InOrder(BTNode *b) /*中序遍历的递归算法*/
57 {
58 if (b!=NULL) {
59 InOrder(b->Left);
60 printf("%c ",b->Element); /*访问根结点*/
61 InOrder(b->Right);
62 }
63 }
64
65 void PostOrder(BTNode *b) /*后序遍历递归算法*/
66 {
67 if (b!=NULL) {
68 PostOrder(b->Left);
69 PostOrder(b->Right);
70 printf("%c ",b->Element); /*访问根结点*/
71 }
72 }
73
74 int CountNode(BTNode *T) /*计算二叉树节点个数*/
75 {
76 if ( T == NULL )
77 return 0;
78 else
79 return 1+CountNode(T->Left)+CountNode(T->Right);
80 }
81
82 int CountLeafNode(BTNode *T) /*计算二叉树叶子节点个数*/
83 {
84 if ( T == NULL )
85 return 0;
86 else if ((T->Left==NULL)&&(T->Right==NULL))
87 return 1;
88 else
89 return CountLeafNode(T->Left)+CountLeafNode(T->Right);
90 }
91
92
93 int TreeDepth(BTNode *b) /*求二叉树的深度 */
94 {
95 int leftDep,rightDep;
96 if (b==NULL) return(0); /*空树的深度为0*/
97 else
98 {
99 leftDep=TreeDepth(b->Left);
100 /*求左子树的深度*/
101 rightDep=TreeDepth(b->Right);
102 /*求右子树的深度*/
103 return(leftDep>rightDep)?(leftDep+1):(rightDep+1);
104 }
105 }
106
107 BTNode *FindNode(BTNode *b,ElementType x)
108 {
109 //在二叉树中查找值为x的结点
110 BTNode *p;
111 if (b==NULL) return NULL;
112 else if (b->Element==x) return b;
113 else
114 {
115 p=FindNode(b->Left,x);
116 if (p!=NULL) return p; //判断子递归返回值
117 else return FindNode(b->Right,x);
118 }
119 }
120
121 int Like(BTNode *b1,BTNode *b2)
122 {
123 /*b1和b2两棵二叉树相似时返回1,否则返回0*/
124 int like1,like2;
125 if (b1==NULL && b2==NULL) return 1;
126 else if (b1==NULL || b2==NULL) return 0;
127 else
128 {
129 like1=Like(b1->Left,b2->Left);
130 like2=Like(b1->Right,b2->Right);
131 return (like1 & like2);
132 /*返回like1和like2的与*/
133 }
134 }
135
136
137 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
138
139 int main(int argc, char *argv[]) {
140 BTNode *T,*p;
141 T=CreateTree(p);
142 PreOrder(T);
143 printf("\nNode:%i\n",CountNode(T));
144 printf("LeafNode:%i\n",CountLeafNode(T));
145 printf("Depth:%i\n",TreeDepth(T));
146
147 BTNode *f=FindNode(T,'c');
148 PreOrder(f);
149
150 return 0;
151 }