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. 从中序与后序遍历序列构造二叉树

你可能感兴趣的:(LeetCode,算法,leetcode,数据结构,二叉树)