前序遍历: 根节点 --> 左节点 --> 右节点
中序遍历: 左节点 --> 根节点 --> 右节点
后序遍历: 左节点 --> 右节点 --> 根节点
已知一棵二叉树的中序遍历为: c, b, d, e, a, g, i, h, j, f; 后序遍历为:c, e, d, b, i, j, h, g, f, a; 求该二叉树的前序遍历?
思路:
1. 由于后序遍历是最后才访问根节点的,所以可知 节点a 为该二叉树的根节点。
2. 由于中序遍历是先遍历左子树,然后遍历根节点,最后遍历右子树,由此可以推断 c, b, d, e 为根节点的左子树, g, i, h, j, f为根节点的右子树。
3. 中序 c,b,d,e; 后序 c, e, d, b; 由后序遍历的特点可以推断出, b 为根节点 a 的左子树。中序遍历,根后序遍历都是先从左节点开始遍历的,所以可以推断 c为该二叉树的左叶子节点。如(图1)
4. 中序(左->根->右): d, e; 后序(左->右->根): e, d; 可以推断 d 为 e 的根节点,e为d的右子树。 于是图1中的“?”为节点 d, 该二叉树的左子树如 (图2)
5. 分析根节点a的右子树。 中序:g, i, h, j, f; 后序:i, j, h, g, f; 根据后序遍历的特点可以推断出 f 是根节点 a 的右子树; 根据中序遍历可以推断出 节点f 只有左子树,没有右子树。 如(图3)
6. 根据后序遍历的特点:左,右,根; 由于节点f没有右子树,那么可以推断 节点g 为 节点f 的左子树,于是(图3)中的“?”为 节点g。
同时根据中序遍历的特点:左,根,右;可以推断 节点g 没有左子树,只有右子树。 如(图4)
7. 中序:g, i, h, j, f; 后序: i, j, h, g, f; 此时还剩3个节点 i, h, j (中序,左->根->右), i, j, h (后序,左->右->根); 于是可以推断 节点h 是 节点i 和 节点j 的根节点, 同时 节点i 是 节点h 的左节点, 节点j 是 节点h 的右节点。 于是(图4)中的 “?” 为 节点h。 完整的二叉树如(图5)
8. 该二叉树的前序遍历(根->左->右)为: a, b, c, d, e, f, g, h, i, j