二叉树的建立与遍历
来源:互联网 发布:上海工商银行待遇知乎 编辑:程序博客网 时间:2024/05/16 09:35
该文章转自:http://www.verydemo.com/demo_c92_i175689.html
二叉树的节点结构为:
1 struct NODE2 {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 else34 {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 // 根节点先入栈116 Stack1[++nTop1] = root;17 while (nTop1 >= 0)18 {19 Temp = Stack1[nTop1--];20 Stack2[++nTop2] = Temp;21 22 // 左子树要先在栈2中被访问,则左子树需先入栈123 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 }
结果:
0 0
- 二叉树的建立与遍历
- c++二叉树的建立与遍历
- 二叉树的建立与先序中序后序遍历
- C++二叉树的建立与遍历
- 二叉树的建立与遍历
- 二叉树的遍历与建立
- 二叉树的建立与遍历
- 二叉树的建立与遍历
- 二叉树的建立与遍历
- 数据结构 二叉树的建立与遍历
- 二叉树的建立与遍历
- 二叉树的建立 与 遍历
- 二叉树的建立与遍历
- 二叉树的建立与遍历
- 二叉树的建立与遍历
- 线索二叉树的建立与遍历
- 二叉树的建立与遍历
- 二叉树的建立与遍历
- JS解析json数据(如何将json字符串转化为数组)
- 浏览器内核分类
- PHP本地文件包含(LFI)漏洞利用
- js执行效率分析
- javascript 错误处理
- 二叉树的建立与遍历
- 用Js的eval解析JSON
- autorun.inf 删除方法
- 挑战无处不在
- 程序员的谎谬之言还是至理名言?
- js window.open( ) 参数详解
- 狐浏览器中不支持js中window.close的解决方
- google 免费DNS 8.8.8.8
- 腾讯帐号申诉的用户体验