题解 | #从中序与后序遍历序列构造二叉树#

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

https://www.nowcoder.com/practice/ab8dde7f01f3440fbbb7993d2411a46b

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param inorder int整型一维数组 中序遍历序列
     * @param postorder int整型一维数组 后序遍历序列
     * @return TreeNode类
     */
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        // write code here

        //先判断是否可操作(长度判0很重要,不然会报错下标越界)
        if (inorder.length != postorder.length || inorder.length == 0) return null;
        //如果只有一个
        if (postorder.length == 1) return new TreeNode(inorder[0]);

        //拿到根节点
        int rootVal = postorder[postorder.length - 1];
        TreeNode node = new TreeNode(rootVal);

        //找到根节点在中序遍历中的位置
        int index = 0;
        for (int i = 0; i < inorder.length; i++) {
            if (inorder[i] == rootVal) {
                index = i;
                break;
            }
        }

        //存左子树
        int[] left = new int[index];
        int[] leftB = new int[index];
        //存右子树
        int[] right = new int[inorder.length - 1 - index];
        int[] rightB = new int[inorder.length - 1 - index];

        //根据根节点位置分割出中序左子树节点和后序左子树节点
        for (int i = 0; i < index; i++) {
            left[i] = inorder[i];
            leftB[i] = postorder[i];
        }

        //根据根节点位置分割出中序右子树节点和后序右子树节点
        for (int i = index + 1; i < inorder.length; i++) {
            right[i - index - 1] = inorder[i];
        }
        for (int i = index; i < postorder.length - 1; i++) {
            rightB[i - index] = postorder[i];
        }

        node.left = buildTree(left, leftB);
        node.right = buildTree(right, rightB);

        return node;
    }
}

全部评论

相关推荐

莫忧莫惧莫回头:md,诈骗犯!之前的简历都是男的。现在想改成女的让我们给你建议是吧😅。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务