剑指Offer:面试题07.重建二叉树
本文最后更新于 1397 天前,其中的信息可能已经有所发展或是发生改变。

1.要点

  • 二叉树遍历
  • 重复在数组中查找某个数时(重复+查找=二重循环),应考虑是否可以用map

2.题目

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

3.示例

给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

4.限制:

0 <= 节点个数 <= 5000

5.代码

public TreeNode buildTree(int[] preorder, int[] inorder) {
        return preorder.length == 0 ? null : buildNode(preorder, inorder);
    }

    public TreeNode buildNode(int[] preorder, int[] inorder) {
        int rootNodeIndex = -1;
        int rootNodeValue = 0;
        Map<Integer,Integer> inorderMap = new HashMap<>();
        for (int i = 0; i < inorder.length; i++) {
            inorderMap.put(inorder[i],i);
        }

        for (int i = 0; i < preorder.length; i++) {
                if (null != inorderMap.get(preorder[i])) {
                    rootNodeIndex = inorderMap.get(preorder[i]);
                    rootNodeValue = preorder[i];
                    break;
                }
        }

        TreeNode treeNode = new TreeNode(rootNodeValue);
        treeNode.left = rootNodeIndex > 0 ?
                buildNode(preorder, Arrays.copyOfRange(inorder, 0, rootNodeIndex)) :
                null;
        treeNode.right = rootNodeIndex < inorder.length - 1 ?
                buildNode(preorder, Arrays.copyOfRange(inorder, rootNodeIndex + 1, inorder.length)) :
                null;
        return treeNode;
    }
作者:Yuyy
博客:https://yuyy.info
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇