(LeetCode 面试经典 150 题) 105. 从前序与中序遍历序列构造二叉树 (二叉树、深度优先搜索dfs)
题目: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) {} * }; */classSolution{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=newTreeNode(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;}//说明当前父节点是个叶子结点returnnullptr;} TreeNode*buildTree(vector<int>& preorder, vector<int>& inorder){returndfs(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; * } * } */classSolution{TreeNodedfs(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=newTreeNode(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;}returnnull;}publicTreeNodebuildTree(int[] preorder,int[] inorder){returndfs(preorder,inorder,0,0,inorder.length-1);}}GO版本:
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */funcbuildTree(preorder []int, inorder []int)*TreeNode {returndfs(preorder,inorder,0,0,len(inorder)-1)}funcdfs(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 }returnnil}