Fork me on GitHub

数据结构与算法——二叉树的遍历

二叉树的遍历是指从根结点出发,按照某种次序依次访问所有结点,使得每个结点被当且访问一次。共分为四种方式:

1. 前序遍历

先访问根节点,然后前序遍历左子树,再前序遍历右子树

 

上图前序遍历结果: 19  7  5  11  15  25  21  61 

前序遍历实现:

递归实现

 1 /***************************
 2 * 采用递归方式实现前序遍历 *
 3 ****************************/
 4 void PreOrderRec(Btree *root)
 5 {
 6     if (root == NULL)
 7     {
 8         return;
 9     }
10     printf("- %d -", root->data);
11     preOrderRec(root->lchild);
12     preOrderRec(root->rchild);
13 }

 

非递归实现

具体过程:

首先申请一个新的栈,记为 stack;

将头结点 head 压入 stack 中;

每次从 stack 中弹出栈顶节点,记为 cur,然后打印 cur 值,如果 cur 右孩子不为空,则将右孩子压入栈中;

如果 cur 的左 孩子不为空,将其压入 stack 中;

重复步骤 3,直到 stack 为空.

 1 /************************
 2 * 借助栈实现前序遍历
 3 *************************/
 4 void PreOrder(Btree *root)
 5 {
 6     Bnode cur ;
 7     if (root == NULL)
 8     {
 9         return;
10     }
11     SqStack stack;
12     InitStack(stack);
13     PushStack(stack, *root);             //头节点先入栈
14     
15     while (!(IsEmpty(stack)))            //栈为空,所有节点均已处理
16     {
17         PopStack(stack, cur);            //要遍历的节点
18         printf("- %d -", cur.data);
19         if (cur.rchild != NULL)
20         {
21             PushStack(stack, *(cur.rchild));  //右子节点先入栈,后处理
22         }
23         if (cur.lchild != NULL)
24         {
25             PushStack(stack, *(cur.lchild));  //左子节点后入栈,接下来先处理
26         }
27     }
28     DestroyStack(stack);
29 }

 

 

2. 中序遍历

先访问根节点的左子树,然后访问根节点,最后遍历右子树

 

中序遍历结果: 5  7  11  15  19  21  25  61 

 1 /***************************
 2 * 采用递归方式实现中序遍历 *
 3 ****************************/
 4 void PreOrderRec(Btree* root)
 5 {
 6     if (root == NULL)
 7     {
 8         return;
 9     }
10     preOrderRec(root->lchild);
11     printf("- %d -", root->data);
12     preOrderRec(root->rchild);
13 }

 

 

 3. 后序遍历

从左到右,先叶子后节点的方式遍历访问左右子树,最后访问根节点

 

后序遍历结果: 5  15  11  7  21  61  25  19 

 

 

4. 层序遍历

从根节点从上往下逐层遍历,在同一层,按从左到右的顺序对节点逐个访问

 

 

 

上图层序遍历结果: 19  7  25  5  11  21  61  15 

 

posted @ 2020-11-16 22:37  索智源  阅读(146)  评论(0编辑  收藏  举报