Loading

树结点的定义:

1 struct TreeNode
2 {
3     ElementType data;                       // 树结点的数据元素域
4     struct TreeNode *subtree[TREEDEGREE];   // TREEDEGREE为已知的树的度,subtree[index]为指向孩子的指针
5 };

遍历操作:

 1 /*
 2  * 先根遍历
 3  */
 4 void preorderTraverse(struct TreeNode *root)
 5 {
 6     if(root != NULL) {                                      // 若树空则返回
 7         print(root->data);                                  // 访问根结点数据域
 8         for(int index = 0; index < TREEDEGREE; ++index)     // 从左到右依次先根遍历各棵子树
 9             preorderTraverse(root->subtree[index]);
10     }
11 }
12 
13 /*
14  * 后根遍历
15  */
16 void postorderTraverse(struct TreeNode *root)
17 {
18     if(root != NULL) {                                      // 若树空则返回
19         for(int index = 0; index < TREEDEGREE; ++index)     // 从左到右依次后根遍历各棵子树
20             postorderTraverse(root->subtree[index]);
21         print(root->data);                                  // 访问根结点数据域
22     }
23 }
24 
25 /*
26  * 层序遍历
27  */
28 void levelorderTraverse(struct TreeNode *root)
29 {
30     Queue queue;                                            // 定义一个队列
31     initQueue(queue);                                       // 初始化队列
32     if(root != NULL)                                        // 若根结点不空,则将根结点入队
33         enQueue(queue, root);
34     while(!isEmpty(queue)) {                                /* 若队列不空,则继续循环 */
35         struct TreeNode temp = outQueue(queue);             // 队头元素出队列
36         print(temp->data);                                  // 输出刚出队列的结点的数据
37         for(int index = 0; index < TREEDEGREE; ++index)     // 将刚出队列的结点的子树的根结点入队
38             if(root->subtree[index] != NULL)
39                 enQueue(queue, root->subtree[index]);
40     }
41 }

树的简单应用:

 1 /*
 2  * 统计树的结点数
 3  */
 4 int countTreeNodes(struct TreeNode *root) 
 5 {
 6     static int count = 0;                                       // 全局变量count用于统计树的结点数
 7     if(root == NULL) {                                          // 若树根结点root为空,则返回0
 8         return 0;
 9     } else {                                                    // 若树根结点root不为空,则循环递归统计该树的结点数
10         for(int index = 0; index < TREEDEGREE; ++index)
11             count += countTreeNodes(root->subtree[index]);
12         return count + 1;                       // 此处需要加 1 ,是因为count此时只统计了root的子树的结点数,并未包括root这一结点
13     }
14 }
15 
16 /*
17  * 计算树的深度
18  */
19 int countTreeDeepth(struct TreeNode *root)
20 {
21     if(root == NULL) {                                          // 若树空,则返回深度0
22         return 0;
23     } else {                                                    // 若树不空则先分别计算出各棵子树的深度,并求出其最大值
24         int maxDeepth = 0;
25         for(int index = 0; index < TREEDEGRE; ++index) {
26             int deepth = countTreeDeepth(root->[index]);
27             if(deepth > maxDeepth)
28                 maxDeepth = deepth;
29         }
30         return maxDeepth + 1;
31     }
32 }
33 
34 /*
35  * 清除树结构
36  */
37 void clearTree(struct TreeNode *root)
38 {
39     if(root != NULL) {                                          // 若树不为空,则需清除树结构
40         for(int index = 0; index < TREEDEGREE; ++index)         // 循环递归清除root的各棵子树
41             clearTree(root->[index]);
42         delete root;                                            // 释放root占用的内存空间
43         root = NULL;                                            // root指针变量置空
44     }
45 }

 

OK哒!O(∩_∩)O哈!

posted @ 2014-07-18 22:20  dai.sp  阅读(226)  评论(0编辑  收藏  举报