Java已知前序和中序/中序和后序还原二叉树

本文介绍了如何通过已知的前序和中序遍历,以及后序和中序遍历来重建二叉树。详细解析了重建过程中的规律,并提供了具体的例子进行说明,最后指出前序和后序遍历无法唯一确定二叉树。
摘要由CSDN通过智能技术生成

数据结构的题目:

只知道前序和中序怎么知道二叉树呢??
只知道中序和后序怎么知道二叉树呢??

现在我们来了解一下基础的原理:

先知道概念噢!qwq~~~

前序遍历:先访问当前节点,再访问当前节点的左子树,最后访问当前节点的右子树。对于二叉树,深度遍历与此同。规律:根在前;子树在根后且左子树比右子树靠前,且第一个就是根节点;

中序遍历:先访问当前节点的左子树,然后访问当前节点,最后是当前节点的右子树,二叉树,中序遍历会得到数据升序效果。规律:根在中;左子树在跟左边,右子树在根右边,左边部分是根结点的左子树的中序遍历序列,右边部分是根结点的右子树的中序遍历序列 ;

后序遍历:先访问当前节点的左子树,然后是当前节点的又子树,最后是当前节点。规律:根在后;子树在根前且左子树比右子树靠前,且最后一个节点是根节点。

一、前序+中序

  1. 根据前序序列的第一个元素建立根结点;
  2. 在中序序列中找到该元素,确定根结点的左右子树的中序序列;
  3. 在前序序列中确定左右子树的前序序列;
  4. 由左子树的前序序列和中序序列建立左子树;
  5. 由右子树的前序序列和中序序列建立右子树。
    如:已知一棵二叉树的先序遍历序列和中序遍历序列分别是abdgcefh、dgbaechf,求二叉树及后序遍历序列。
    先序:abdgcefh—>a bdg cefh

中序:dgbaechf---->dgb a echf

得出结论:a是树根,a有左子树和右子树,左子树有bdg结点,右子树有cefh结点。
先序:bdg—>b dg

中序:dgb —>dg b

得出结论:b是左子树的根结点,b无右子树,有左子树。
先序:dg---->d g

中序:dg----->dg

得出结论:d是b左子树的根节点,d无左子树,g是d的右子树

然后对于a 的右子树类似可以推出

最后还原:

                                                          a
                                  b                                                 c

           d                                                       e                                f

                 g                                                                      h

后序遍历:gdbehfca

二、后序+中序:

已知一棵二叉树的后序序列和中序序列,构造该二叉树的过程如下:

  1. 根据后序序列的最后一个元素建立根结点;
  2. 在中序序列中找到该元素,确定根结点的左右子树的中序序列;
  3. 在后序序列中确定左右子树的后序序列;
  4. 由左子树的后序序列和中序序列建立左子树;
  5. 由右子树的后序序列和中序序列建立右子树

如还是上面题目:如:已知一棵二叉树的后序遍历序列和中序遍历序列分别是gdbehfca、dgbaechf,求二叉树

后序:gdbehfca---->gdb ehfc a

中序:dgbaechf----->dgb a echf
得出结论:a是树根,a有左子树和右子树,左子树有bdg结点,右子树有cefh结点。
后序:gdb---->gd b

中序:dgb----->dg b

得出结论:b是a左子树的根节点,无右子树,有左子树dg。

后序:gd---->g d

中序:dg----->d g

得出结论:d是b的左子树根节点,g是d的右子树。

然后对于a 的右子树类似可以推出。然后还原。
在这里插入图片描述

三、前序+后序

前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树。 故此法无。不能唯一确定一个二叉树。


相信到这里大家都理解了叭~
那我就直接上代码了噢

import java.util.*;

import tree.BinaryTreeDemo.BinaryTree;

 
/**
 * 根据前序和中序还原二叉树
 *
 */

 class TreeNode {
   
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) {
    val = x; }
}
 
 
 /*
public class tee2 {
    public static TreeNode1 reConstructBinaryTree(int [] pre,int [] in) {
        //1.由前序遍历确认根节点
        int node=pre[0];
        TreeNode1 tree=new TreeNode1(node);

        //2.由中序遍历确认左右子树节点
        ArrayList<Integer> leftTreeForIn=new ArrayList<>();
        ArrayList<Integer> rightTreeForIn=new ArrayList<&
二叉树前序遍历顺序为:根节点、左子树、右子树;中序遍历顺序为:左子树、根节点、右子树。可以利用这两个遍历顺序构建出二叉树,然后再进行后序遍历即可。 具体步骤如下: 1. 根据前序遍历找到根节点,将中序遍历分成左子树和右子树两部分。 2. 对左子树和右子树分别递归进行步骤1,直到子树只有一个节点或为空。 3. 按照左子树、右子树、根节点的顺序进行后序遍历。 下面是Python实现代码: ```python class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None def buildTree(preorder, inorder): if not preorder or not inorder: return None root = TreeNode(preorder[0]) index = inorder.index(root.val) root.left = buildTree(preorder[1:index+1], inorder[:index]) root.right = buildTree(preorder[index+1:], inorder[index+1:]) return root def postorderTraversal(root): if not root: return [] stack1 = [root] stack2 = [] while stack1: node = stack1.pop() stack2.append(node) if node.left: stack1.append(node.left) if node.right: stack1.append(node.right) res = [] while stack2: res.append(stack2.pop().val) return res preorder = [1, 2, 4, 5, 3, 6, 7] inorder = [4, 2, 5, 1, 6, 3, 7] root = buildTree(preorder, inorder) print(postorderTraversal(root)) # [4, 5, 2, 6, 7, 3, 1] ``` 其中,buildTree函数用于构建二叉树,postorderTraversal函数用于进行后序遍历。以上代码输出[4, 5, 2, 6, 7, 3, 1],即为二叉树后序遍历结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值