数据结构与算法——二叉树的遍历
二叉树的遍历是指从根结点出发,按照某种次序依次访问所有结点,使得每个结点被当且访问一次。共分为四种方式:
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