题目:105. 从前序与中序遍历序列构造二叉树
思路:深度优先搜索dfs
先序遍历的第一个点是当前子树的根节点,找到这个点在中序遍历的位置,那么左边就是当前子树的左子树,右边就是当前节点的右子树。
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 {
public:
// a、b、c分别表示:先序遍历的左区间、中序遍历的左区间、中序遍历的右区间
TreeNode * dfs(vector<int>& preorder, vector<int>& inorder,int a,int b,int c){
for(int i=b;i<=c;i++){
// 到当前子树的根节点才不会跳过
if(preorder[a]!=inorder[i]) continue;
// 当前子树的根节点
TreeNode * tmp=new TreeNode(preorder[a]);
// 中序节点的左边[b,i-1]是左子树
tmp->left=dfs(preorder,inorder,a+1,b,i-1);
// 中序节点的右边[i+1,c]是右子树
tmp->right=dfs(preorder,inorder,a+i-b+1,i+1,c);
return tmp;
}
//说明当前父节点是个叶子结点
return nullptr;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return dfs(preorder,inorder,0,0,inorder.size()-1);
}
};
JAVA版本:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
TreeNode dfs(int[] preorder, int[] inorder,int a,int b,int c){
for(int i=b;i<=c;i++){
if(preorder[a]!=inorder[i]) continue;
TreeNode tmp=new TreeNode(preorder[a]);
tmp.left=dfs(preorder,inorder,a+1,b,i-1);
tmp.right=dfs(preorder,inorder,a+i-b+1,i+1,c);
return tmp;
}
return null;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
return dfs(preorder,inorder,0,0,inorder.length-1);
}
}
GO版本:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func buildTree(preorder []int, inorder []int) *TreeNode {
return dfs(preorder,inorder,0,0,len(inorder)-1)
}
func dfs(preorder []int,inorder []int,a int,b int,c int) *TreeNode {
for i:=b;i<=c;i++ {
if preorder[a]!=inorder[i] {continue}
tmp:=&TreeNode{Val:preorder[a]}
tmp.Left=dfs(preorder,inorder,a+1,b,i-1)
tmp.Right=dfs(preorder,inorder,a+i-b+1,i+1,c)
return tmp
}
return nil
}