leetcode 105.从前序与中序遍历序列构造二叉树
思路:递归分冶
这道题有点像根据数组构造二叉搜索树那道题,只不过,这里说了是根据两个数组进行判断。
一般我们在数据结构的题目当中都是靠试一试的想法做出这样判断二叉树的题,但是到了真正写程序的时候,思路就显然不知道怎么样了,因为我们需要让计算机知道大脑是怎么想的。
我们知道,前序遍历的第一个结点就是根节点,我们可以在对应的中序遍历列表中找到与其对应的元素的下标,这个下标的往左一直到结束,就是左子树的部分,往右就是右子树的部分,所以我们就初步判断了这样的结论。我们可以想,接下来的步骤是不是也可以按照这个想法进行呢?我们截取除根节点以外的左子树部分,然后再从中找出一个类根结点,这个结点就是这棵树的左子树的第一个结点,同理,右子树也能找到这样的一个类根节点。我们一直递归下去不就能够构造出一棵树了吗?
顺着这个思路,我们知道了:通过递归的方法,以及切割数组的方法来判断每次子树的根节点,然后相连接起来,合成的就是一颗完整的树了,其本质就在于找各个子树的根节点。
/**
* 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) {
if(preorder.length==0||inorder.length==0)
return null;
int index=0;
for(int i=0;i<inorder.length;i++){
if(preorder[0]==inorder[i]){
index=i;
break;
}
}
TreeNode root=null;
root=bianli(root,preorder,inorder);
return root;
}
public TreeNode bianli(TreeNode t,int []a,int []b){
if(a.length==0||b.length==0){
return null;
}
TreeNode tmp=new TreeNode();
for(int i=0;i<b.length;i++){
if(a[0]==b[i]){
tmp.val=b[i];
t=tmp;
int []a_l=Arrays.copyOfRange(a,1,i+1);
int []a_r=Arrays.copyOfRange(a,i+1,a.length);
int []b_l=Arrays.copyOfRange(b,0,i);
int []b_r=Arrays.copyOfRange(b,i+1,b.length);
t.left=bianli(t.left,a_l,b_l);
t.right=bianli(t.right,a_r,b_r);
}
}
return t;
}
}
原文地址:https://blog.csdn.net/m0_73917165/article/details/142328250
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!