LeetCode105.从前序与中序遍历序列构造二叉树(递归)
解题思路
此处撰写解题思路
1.前序遍历序列的第一个元素为根节点
2.在中序遍历序列中找到这个元素,记录位置inindex
3.中序遍历序列中,inindex左边为左子树的中序遍历序列,长度为 len1=inindex-inleft,即[0,inindex-1],
inindex右边为右子树的中序遍历序列, 长度为len2=inright-inindex-1, 即[inindex+1,inright];
4.前序遍历序列中,[preleft,preleft+len1]为左子树的前序遍历序列,
[preright-len2,preright]为右子树的前序遍历序列;
/**
* 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 {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return dfs(preorder,inorder,0,preorder.length-1,0,inorder.length-1);
}
public TreeNode dfs(int[] preorder, int[] inorder, int preleft, int preright, int inleft, int inright) {
if(inleft > inright || preleft > preright) return null;
TreeNode root = new TreeNode(preorder[preleft]);
int inindex = inleft;
for(int i = inleft; i <= inright; i++) {
if(preorder[preleft] == inorder[i]) {
inindex = i;
break;
}
}
root.left = dfs(preorder,inorder,preleft+1,preleft+inindex-inleft,inleft,inindex-1);
root.right = dfs(preorder,inorder,preright-(inright-inindex)+1,preright,inindex+1,inright);
return root;
}
}
详细版本(带注释):
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return dfs(preorder,inorder,0,preorder.length-1,0,inorder.length-1);
}
public TreeNode dfs(int[] preorder, int[] inorder, int preleft, int preright, int inleft, int inright) {
//如果长度小于1,返回null;
if(inleft > inright || preleft > preright) return null;
//根节点
TreeNode root = new TreeNode(preorder[preleft]);
//找到根节点在中序遍历序列中的位置
int inindex = inleft;
for(int i = inleft; i <= inright; i++) {
if(preorder[preleft] == inorder[i]) {
inindex = i;
break;
}
}
int len1 = inindex-inleft;
int len2 = inright-inindex-1;
//左节点
root.left = dfs(preorder,inorder,preleft+1,preleft+len1,inleft,inindex-1);
//右节点
root.right = dfs(preorder,inorder,preright-len2,preright,inindex+1,inright);
return root;
}
}
作者:oyzg(醉笙)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/solution/105cong-qian-xu-yu-zhong-xu-bian-li-xu-l-yumu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
谢谢观看!不如来个一键三连吧!哈哈~~~