ldjhust

工欲善其事 必先利其器

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

    二叉树的节点结构为:

1 struct NODE
2 {
3     char ch;
4 
5     struct NODE *lChild;
6     struct NODE *rChild;
7 };

    按照前序的顺序递归建立一颗二叉树:

 1 void PreOrderCreatBinary(struct NODE **root)
 2 {
 3     // 函数入口检验
 4     if (NULL == root)
 5     {
 6         printf ("Invalid Parameter(s)!\n");
 7         return;
 8     }
 9 
10     char ch;
11 
12     printf ("Input NODE value, '#' equal NULL:");
13     scanf ("%c", &ch);
14 
15     // 去掉输入结束按下的回车符
16     getchar();
17 
18     if ('#' == ch)
19     {
20         *root = NULL;
21         return;
22     }
23 
24     if (NULL == (*root = (struct NODE *)malloc(sizeof(struct NODE))))
25     {
26         printf ("Fail to malloc space for *root!\n");
27         return;
28     }
29 
30     (*root)->ch = ch;
31 
32     // 建立其左子树
33     printf ("Create %c's left child.\n", (*root)->ch);
34     PreOrderCreatBinary (&((*root)->lChild));
35 
36     // 建立其右子树
37     printf ("Create %c's right child.\n", (*root)->ch);
38     PreOrderCreatBinary (&((*root)->rChild));
39 }

    前序递归遍历二叉树:

 1 void RecursionPreOrder(struct NODE *root)
 2 {
 3     if (NULL != root)
 4     {
 5         // 访问根节点
 6         printf ("%c ", root->ch);
 7 
 8         // 访问左子树
 9         RecursionPreOrder (root->lChild);
10 
11         // 访问右子树
12         RecursionPreOrder (root->rChild);
13     }
14 }

    第一种非递归前序遍历二叉树的方式:

 1 void NonRecursivePreOrder(struct NODE *root)
 2 {
 3     if (NULL == root)
 4     {
 5         printf ("Empty Binary Tree!\n");
 6         return;
 7     }
 8 
 9     struct NODE *Stack[MAX];
10     int nTop = -1;
11     struct NODE *Temp = NULL;
12 
13     // 根节点首先入栈
14     Stack[++nTop] = root;
15     while (nTop >= 0)
16     {
17         // 取出栈顶节点并访问
18         Temp = Stack[nTop--];
19         printf ("%c ", Temp->ch);
20 
21         // 左子树要先于右子树被访问,则右子树先入栈
22         if (NULL != (Temp->rChild))
23         {
24             Stack[++nTop] = Temp->rChild;
25         }
26 
27         // 然后左子树入栈
28         if (NULL != (Temp->lChild))
29         {
30             Stack[++nTop] = Temp->lChild;
31         }
32     }
33 }

    第二种非递归前序遍历二叉树的方式:

 1 void NonRecursivePreOrder2(struct NODE *root)
 2 {
 3     if (NULL == root)
 4     {
 5         printf ("Empty Binary Tree!\n");
 6         return;
 7     }
 8 
 9     struct NODE *Stack[MAX];
10     int nTop = -1;
11     struct NODE *Temp = root;
12 
13     // 访问当前节点及其全部左子树
14     while (NULL != Temp)
15     {
16         printf ("%c ", Temp->ch);
17 
18         Stack[++nTop] = Temp;
19         Temp = Temp->lChild;
20     }
21 
22     while (nTop >= 0)
23     {
24         // 取得栈顶元素的右子树
25         Temp = Stack[nTop]->rChild;
26         --nTop;
27 
28         // 同样访问当前节点及其全部左子树
29         while (NULL != Temp)
30         {
31             printf ("%c ", Temp->ch);
32             
33             Stack[++nTop] = Temp;
34             Temp = Temp->lChild;
35         }
36     }
37 }

    中序递归遍历二叉树:

 1 void RecursionInOrder(struct NODE *root)
 2 {
 3     if (NULL != root)
 4     {
 5         // 访问左子树
 6         RecursionInOrder (root->lChild);
 7 
 8         // 访问根节点
 9         printf ("%c ", root->ch);
10 
11         // 访问右子树
12         RecursionInOrder (root->rChild);
13     }
14 }

    中序非递归遍历二叉树:

 1 void NonRecursionInOrder(struct NODE *root)
 2 {
 3     if (NULL == root)
 4     {
 5         printf ("Empty Binary Tree!\n");
 6         return;
 7     }
 8 
 9     struct NODE *Stack[MAX];
10     int nTop = -1;
11     struct NODE *curr = root->lChild;
12 
13     Stack[++nTop] = root;
14 
15     while ((NULL != curr) || (nTop >= 0))
16     {
17         // 根节点及其左子树全部入栈
18         while (NULL != curr)
19         {
20             Stack[++nTop] = curr;
21             curr = curr->lChild;
22         }
23 
24         // 访问栈顶节点
25         curr = Stack[nTop--];
26         printf ("%c ", curr->ch);
27 
28         curr = curr->rChild;
29     }
30 }

    后序递归遍历二叉树:

 1 void RecursionPostOrder(struct NODE *root)
 2 {
 3     if (NULL != root)
 4     {
 5         // 访问左子树
 6         RecursionPostOrder (root->lChild);
 7 
 8         // 访问右子树
 9         RecursionPostOrder (root->rChild);
10 
11         // 访问根节点
12         printf ("%c ", root->ch);
13     }
14 }

    第一种后序非递归遍历二叉树的方式:

 1 void NonRecursionPostOrder(struct NODE *root)
 2 {
 3     if (NULL == root)
 4     {
 5         printf ("Empty Binary Tree!\n");
 6         return;
 7     }
 8 
 9     struct NODE *Stack[MAX];
10     int nTop = -1;
11     struct NODE *curr = root;
12     struct NODE *Previewed = NULL;
13 
14     while ((NULL != curr) || (nTop >= 0))
15     {
16         while (NULL != curr)
17         {
18             Stack[++nTop] = curr;
19             curr = curr->lChild;
20         }
21         
22         // 获取当前栈顶节点
23         curr = Stack[nTop];
24 
25         // 判断当前节点的右子树状态然后做出相应的操作
26         if ((NULL == (curr->rChild)) || (Previewed == (curr->rChild)))
27         {
28             printf ("%c ", curr->ch);
29             Previewed = curr;
30             curr = NULL;
31             --nTop;
32         } 
33         else
34         {
35             curr = curr->rChild;
36         }
37     }
38 }

    第二种后序非递归遍历二叉树的方式:

 1 void NonRecursionPostOrder2(struct NODE *root)
 2 {
 3     if (NULL == root)
 4     {
 5         printf ("Empty Binary Tree!\n");
 6         return;
 7     }
 8 
 9     struct NODE *Stack1[MAX];
10     int nTop1 = -1;
11     struct NODE *Stack2[MAX];
12     int nTop2 = -1;
13     struct NODE *Temp = NULL;
14 
15     // 根节点先入栈1
16     Stack1[++nTop1] = root;
17     while (nTop1 >= 0)
18     {
19         Temp = Stack1[nTop1--];
20         Stack2[++nTop2] = Temp;
21 
22         // 左子树要先在栈2中被访问,则左子树需先入栈1
23         if (NULL != (Temp->lChild))
24         {
25             Stack1[++nTop1] = Temp->lChild;
26         }
27 
28         if (NULL != (Temp->rChild))
29         {
30             Stack1[++nTop1] = Temp->rChild;
31         }
32     }
33 
34     // 按2栈出栈顺序打印即是后序顺序
35     while (nTop2 >= 0)
36     {
37         Temp = Stack2[nTop2--];
38         printf ("%c ", Temp->ch);
39     }
40 }

    测试主函数:

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 #define MAX 100
 4 
 5 int main(void)
 6 {
 7     struct NODE *root = NULL;
 8 
 9     // 前序建立二叉树
10     PreOrderCreatBinary (&root);
11 
12     printf ("\n建立的二叉树的前序递归遍历序列为:\n");
13     RecursionPreOrder (root);
14     printf ("\n");
15 
16     printf ("\n建立的二叉树的前序第一种非递归方式遍历序列为:\n");
17     NonRecursivePreOrder (root);
18     printf ("\n");
19 
20     printf ("\n建立的二叉树的前序第二种非递归方式遍历序列为:\n");
21     NonRecursivePreOrder2 (root);
22     printf ("\n");
23 
24     printf ("\n建立的二叉树的中序递归遍历序列为:\n");
25     RecursionInOrder (root);
26     printf ("\n");
27 
28     printf ("\n建立的二叉树的中序非递归遍历序列为:\n");
29     NonRecursionInOrder (root);
30     printf ("\n");
31 
32     printf ("\n建立的二叉树的后序递归遍历序列为:\n");
33     RecursionPostOrder (root);
34     printf ("\n");
35 
36     printf ("\n建立的二叉树的后序第一种非递归方式遍历序列为:\n");
37     NonRecursionPostOrder (root);
38     printf ("\n");
39 
40     printf ("\n建立的二叉树的后序第二种非递归方式遍历序列为:\n");
41     NonRecursionPostOrder2 (root);
42     printf ("\n");
43 
44     return(0);
45 }

    结果:

posted on 2013-04-01 19:42  ldjhust  阅读(333)  评论(0编辑  收藏  举报