106. 从中序与后序遍历序列构造二叉树

本文介绍了一种根据给定的中序和后序遍历序列构造二叉树的方法。通过递归地确定根节点及其左右子树的范围,最终还原整个二叉树结构。

题目描述

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

示例 1:

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]
示例 2:

输入:inorder = [-1], postorder = [-1]
输出:[-1]

提示:

1 <= inorder.length <= 3000
postorder.length == inorder.length
-3000 <= inorder[i], postorder[i] <= 3000
inorder 和 postorder 都由 不同 的值组成
postorder 中每一个值都在 inorder 中
inorder 保证是树的中序遍历
postorder 保证是树的后序遍历


做题思路

  • 本题重点考察的是如何根据给定的 前序中序的结果去还原二叉树

  • 想要把本题做出来必须要有一定的数据结构的基础,尤其是对二叉树的三种遍历方式有所了解才可以

  • 前序遍历: 根 左 右

  • 中序遍历: 左 根 右

  • 后序遍历: 左 右 根

  • 知道了二叉树的三种遍历方式我们再来看题目,题目中给我们的是二叉树的后序和中序的遍历结果。

  • 我来大概的说一下本题的实现思路;

    我们已经知道了后序遍历的话最后一次遍历的必定是 根结点

    通过这个根节点我们就可以到题目中给出的中序遍历的数组里面去寻找这个根节点,找到了这个根节点之后我们就可以得知这颗二叉树左子树一共有多少个结点以及右子树有多少个结点了(也可以理解为左或右子树的长度了)

  • 然后我们就可以通过递归来接着上一步的操作继续的去执行,直到把先序数组全部都遍历完成,就可以结束开始回调了

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        return makeTree(inorder,0,inorder.length-1,postorder,0,postorder.length-1);
    }
    public TreeNode makeTree(int[] inorder,int i,int j,int[] postorder,int p,int q){
        if(q<p)return null;

        TreeNode root=new TreeNode(postorder[q]);

        int k=j;
        while(inorder[k]!=postorder[q])k--;

        int rightLen=j-k;

        TreeNode right=makeTree(inorder,k+1,j,postorder,q-rightLen,q-1);
        TreeNode left=makeTree(inorder,i,k-1,postorder,p,q-rightLen-1);

        root.left=left;
        root.right=right;

        return root;
    }
}

题目链接

106. 从中序与后序遍历序列构造二叉树

### Java 中二叉树后序遍历实现 #### 递归实现 在Java中,可以通过递归来实现二叉树后序遍历。具体来说,对于每个节点,先递归地遍历其左子树,再递归地遍历其右子树,最后访问该节点并将其值添加到结果列表中。 ```java public class BinaryTree { public static void postorderTraversal(TreeNode root, List<Integer> result) { if (root == null) { return; } // 遍历左子树 postorderTraversal(root.left, result); // 遍历右子树 postorderTraversal(root.right, result); // 访问当前节点 result.add(root.val); } static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } } ``` 这段代码展示了如何使用递归的方法来完成二叉树后序遍历[^2]。 #### 迭代实现 除了递归外,还可以采用迭代的方式来实现后序遍历。这种方法通常借助栈的数据结构来模拟递归调用的过程。下面是一个具体的例子: ```java import java.util.*; public class BinaryTree { public static List<Integer> postorderTraversalIterative(TreeNode root) { List<Integer> result = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); if (root == null) { return result; } TreeNode prev = null; stack.push(root); while (!stack.isEmpty()) { TreeNode current = stack.peek(); if (prev == null || prev.left == current || prev.right == current) { // 当前节点是从父节点进入 if (current.left != null) { stack.push(current.left); } else if (current.right != null) { stack.push(current.right); } else { stack.pop(); result.add(current.val); } } else if (current.left == prev) { // 已经完成了左子树的操作 if (current.right != null) { stack.push(current.right); } else { stack.pop(); result.add(current.val); } } else if (current.right == prev) { // 完成了右子树操作 stack.pop(); result.add(current.val); } prev = current; } return result; } static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } } ``` 上述代码提供了一种利用栈来进行二叉树后序遍历的非递归解决方案[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_x_330

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值