美文网首页
剑指Offer 重建二叉树

剑指Offer 重建二叉树

作者: 小名源治 | 来源:发表于2022-07-23 11:10 被阅读0次

    1.题目

    输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
    假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
    eg:


    image.png

    Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
    Output: [3,9,20,null,null,15,7]

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/zhong-jian-er-cha-shu-lcof

    2.解题

    前序遍历(根在前面):根左右
    中序遍历(根在中间):左右根
    思路: 递归遍历,通过前序遍历找到根节点,然后递归遍历左右(再次找根节点)

      public TreeNode buildTree(int[] preorder, int[] inorder) { // 3,9,20,15,7(i)       9,3,15,20,7(j)
                TreeNode treeNode;
                //1.遍历preorder,看哪个在inorder中首先出现(首先出现就是当前的根节点)
                for (int i = 0; i < preorder.length; i++) {
                    for (int j = 0; j < inorder.length; j++) {
                        if (preorder[i] == inorder[j]){  //3
                            //2.说明这个结点是根节点
                            treeNode = new TreeNode(preorder[i]);
                            //3.递归遍历找到当前结点的左右结点
                            int[] left = new int[j];  // 9
                            for (int k = 0; k < j; k++) {
                                left[k] = inorder[k];
                            }
                            treeNode.left = buildTree(preorder, left);
                            int[] right = new int[inorder.length - j - 1];  // 15 20 7
                            for (int k = 0; k < right.length; k++) {
                                right[k] = inorder[k + j + 1];
                            }
                            treeNode.right = buildTree(preorder, right);
    
                            //4.返回当前结点
                            return treeNode;
                        }
                    }
                }
    
                return null;
            }
    

    相关文章

      网友评论

          本文标题:剑指Offer 重建二叉树

          本文链接:https://www.haomeiwen.com/subject/kyiiirtx.html