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

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

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类
     */
    
    Map<Integer, Integer> map;
    public TreeNode buildTree (int[] inorder, int[] postorder) {
        // write code here
        map = new HashMap<>();
        for (int i = 0; i < inorder.length; ++i) {
            map.put(inorder[i], i);
        }
        TreeNode root = split(inorder, 0, inorder.length, postorder, 0, postorder.length);
        return root;
    }

    private TreeNode split(int[] inorder, int inStart, int inEnd, int[] postorder, int postStart, int postEnd) {
        
        if (inStart >= inEnd || postStart >= postEnd) {
            return null;
        }

        int rootVal = postorder[postEnd - 1];
        // int rootIndex = getIndex(inorder, rootVal);
        int rootIndex = map.get(rootVal);
        // 左子树长度
        int leftLength = rootIndex - inStart;
        TreeNode root = new TreeNode(rootVal);
        // 拆分左子树,包前不包后
        root.left = split(inorder, inStart, rootIndex, postorder, postStart, postStart + leftLength);
        // 拆分右子树,同上
        root.right = split(inorder, rootIndex + 1, inEnd, postorder, postStart + leftLength, postEnd - 1);
        return root;
    }

    /*private int getIndex(int[] order, int val) {
        int index = 0;
        for (int i = 0; i < order.length; ++i) {
            if (order[i] == val) {
                index = i;
                break;
            }
        }
        return index;
    }*/

}

全部评论

相关推荐

生命诚可贵:先不说内容怎么样 排版就已经太差劲了 第一眼看不到重点,第二眼已经没有再看的耐心了, 篇幅占的太满了 字体不要用灰色 观感不好 想重点突出的黑色加粗就可以了 多列要点 少些大段的句子 项目经历把项目用的技术要点列出来,光写个python plc什么的太宽泛了 自我评价也有点偏多
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务