码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal

时间:2020-04-21 13:31:31      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:时间   相对   wing   follow   treenode   tree   树节点   code   traversal   

从前序与中序遍历序列构造二叉树。题意是给一个二叉树的前序遍历和中序遍历,请根据这两个遍历,把树构造出来。例子,

For example, given

preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]

Return the following binary tree:

    3
   /   9  20
    /     15   7

思路是递归。首先,会从preorder的首个元素知道这个树的根节点root是谁,然后在中序遍历中找到这个根节点,在其左边的所有元素会构成其左子树,在其右边的元素会构成其右子树。

还是跑这个例子,

preorder = [3,9,20,15,7] - 3是根节点

inorder = [9,3,15,20,7] - 9是左子树节点;15,20,7会构成右子树

根据如上的结论,再下一轮递归调用的时候你会发现20是3的左孩子,而15和7分别是20的左孩子和右孩子。这个题的helper函数没有什么思路可言,只是按照节点在preorder和inorder遍历中相对应的位置,找到左子树和右子树上的节点。

时间O(n)

空间O(n)

Java实现

 1 class Solution {
 2     public TreeNode buildTree(int[] preorder, int[] inorder) {
 3         if (preorder == null || preorder.length == 0 || inorder == null || inorder.length == 0
 4                 || preorder.length != inorder.length) {
 5             return null;
 6         }
 7         return helper(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
 8     }
 9 
10     private TreeNode helper(int[] preorder, int pStart, int pEnd, int[] inorder, int iStart, int iEnd) {
11         //递归的第一步:递归终止条件,避免死循环
12         if (pStart > pEnd || iStart > iEnd) {
13             return null;
14         }
15         //重建根节点
16         TreeNode root = new TreeNode(preorder[pStart]);
17         int index = 0; //index找到根节点在中序遍历的位置
18         while (inorder[iStart + index] != preorder[pStart]) {
19             index++;
20         }
21         //重建左子树
22         root.left = helper(preorder, pStart + 1, pStart + index, inorder, iStart, iStart + index - 1);
23         //重建右子树
24         root.right = helper(preorder, pStart + index + 1, pEnd, inorder, iStart + index + 1, iEnd);
25         return root;
26     }
27 }

 

[LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal

标签:时间   相对   wing   follow   treenode   tree   树节点   code   traversal   

原文地址:https://www.cnblogs.com/aaronliu1991/p/12743668.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!