AI研习图书馆,发现不一样的精彩世界 结构 二叉树的遍历一、简介二叉树的深度优先遍历(DFS)可细分为前序遍历、中序遍历、后序遍历,这三种遍历可以用递归方法实现(本篇随笔主要分析递归实现),也可使用非递归方法实现。
1. 前序遍历 /* 以递归方式 前序遍历二叉树 */ void PreOrderTraverse(BiTree t, int level) { if (t == NULL) { return ; } printf("data = %c level = %d\n ", t->data, level); PreOrderTraverse(t->lchild, level + 1); PreOrderTraverse(t->rchild, level + 1); } 2. 中序遍历 /* 以递归方式 中序遍历二叉树 */ void PreOrderTraverse(BiTree t, int level) { if (t == NULL) { return ; } PreOrderTraverse(t->lchild, level + 1); printf("data = %c level = %d\n ", t->data, level); PreOrderTraverse(t->rchild, level + 1); } 3. 后序遍历 /* 以递归方式 后序遍历二叉树 */ void PreOrderTraverse(BiTree t, int level) { if (t == NULL) { return ; } PreOrderTraverse(t->lchild, level + 1); PreOrderTraverse(t->rchild, level + 1); printf("data = %c level = %d\n ", t->data, level); } printf("data = %c level = %d\n ", t->data, level); 二、案例解析 1. 前序遍历前序遍历特点:根节点->左子树->右子树 注意看前序遍历的代码,printf语句是放在两条递归语句之前的,所以先访问根节点G,打印G,然后访问左子树D,此时左子树D又作为根节点,打印D,再访问D的左子树A。 前序遍历步骤
前序遍历的另一种表述:
(在完成第2,3步的时候,也是要按照前序遍历二叉树的规则完成) 2. 中序遍历中序遍历步骤:
中序遍历的另一种表述:
(在完成第1,3步的时候,要按照中序遍历的规则来完成) 3. 后序遍历
后序遍历的另一种表述:
(在完成1,2步的时候,依然要按照后序遍历的规则来完成) 三、重构二叉树 进入正题,已知两种遍历结果求另一种遍历结果,其实就是重构二叉树。
用上面这些特点来分析遍历结果: 第一步:先看前序遍历,确定根节点为A 第三步:先来分析左子树CBD,那么CBD谁来做A的左子树呢?这个时候不能直接用中序遍历的特点(左->根->右)得出左子树应该是这个样子。 第四步:再观察中序遍历CBDAEF,B左边是C右边是D,说明B节点既有左子树又有右子树,左右子树只有一个元素就可以直接确定了,不用再返回去观察前序遍历 第五步:到这里左子树的重建就已经完成了,现在重建右子树。观察中序遍历右子树为EF,再观察前序遍历ABCDEF中右子树的顺序为EF,所以E为A的右子树,再观察中序便利中E只有右边有F,所有F为E的右子树,最后得到的二叉树是这个样子的。 第二种:已知中序遍历、后序遍历求前序遍历
如上图所示,这两种二叉树前序(BEFA)和后序(AFEB)一样,但对应的中序遍历结果却不一样(左边是AFEB,右边是BEFA),所以仅靠前序和后序无法重构出唯一的二叉树。 综上所述,今天主要讲解了二叉树的遍历及重构二叉树,相信聪明的你已经学会了! 更多数据结构精彩分享,敬请期待! 关注AI研习图书馆,发现不一样的精彩世界 |
|