题目描述:
题号:105
给定两个整数数组 preorder
和 inorder
,其中 preorder
是二叉树的先序遍历, inorder
是同一棵树的中序遍历,请构造二叉树并返回其根节点。
解题思路:
思路一:根据根节点找对应索引
前序遍历性质:节点按照 [ 根节点 | 左子树 | 右子树 ]
排序。
中序遍历性质:节点按照 [ 左子树 | 根节点 | 右子树 ]
排序。
关键点:不断利用以上性质、找到对应的索引,并递归构造出二叉树。
时间复杂度:O(N)
空间复杂度:O(N)
C++
// C++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
vector<int> preorder;
unordered_map<int, int> subMap;
TreeNode* build(int rootVal, int left, int right) {
if(left > right) {
return nullptr;
}
TreeNode* root = new TreeNode(preorder[rootVal]);
int index = subMap[preorder[rootVal]];
root->left = build(rootVal + 1, left, index - 1);
root->right = build(rootVal + index - left + 1, index + 1, right);
return root;
}
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.size() != inorder.size()) {
return nullptr;
}
this->preorder = preorder;
for(int i = 0; i < inorder.size(); i++) {
subMap[inorder[i]] = i;
}
return build(0, 0, inorder.size() - 1);
}
};
go
// go
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func buildTree(preorder []int, inorder []int) *TreeNode {
if len(preorder) == 0 {
return nil
}
root := &TreeNode{preorder[0], nil, nil}
i := 0
for ; i < len(inorder); i++ {
if inorder[i] == preorder[0] {
break
}
}
root.Left = buildTree(preorder[1:len(inorder[:i])+1], inorder[:i])
root.Right = buildTree(preorder[len(inorder[:i])+1:], inorder[i+1:])
return root
}