LeetCode 105. 从前序与中序遍历序列构造二叉树、106. 从中序与后序遍历序列构造二叉树

从前序与中序遍历序列构造二叉树

题目
在这里插入图片描述
分析
一般我们是通过递归,由已知的二叉树获取遍历的序列,这题的要求和以往相反,需要我们通过前序和中序遍历的序列构造出二叉树。基本思路是递归来实现建树,关键是找到不同当前root节点与下一层节点的关系,如何得到两个子树的前序和中序遍历然后递归这个方法,其中还要实现root节点与其左子节点和右子节点的连接。第一次调用该方法new一个根节点,调用左右子树的该方法分别返回一个左子节点和右子节点的实例,然后建立联系。
要点归纳
递归算法在二叉树中的应用核心是找到当前节点的返回结果与子节点的关系,通过获取以子节点为参数的返回值来实现当前的操作目标。总之,找联系!
Arrays.copyOfRange:
这是一个常用的复制数组的方法,可以指定原数组的两个下标分别作为起点和终点,这个区间左闭右开。
此题:此题要做两件事情:1、找到四个数组,然后分别递归左右子树。2、把返回的两个节点和当前节点建立联系。
代码

class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder.length==0){
        	return null;
        }
        TreeNode root=new TreeNode(preorder[0]);
        int rootNum=0;
        for(int i=0;i<inorder.length;i++){
        	if(inorder[i]==preorder[0]){
        		rootNum=i;
        		break;
        	}
        }
        int num1=rootNum;
        int num2=inorder.length-rootNum-1;
        int[] leftPre=Arrays.copyOfRange(preorder,1, num1+1);
        int[] rightPre=Arrays.copyOfRange(preorder, num1+1, num1+num2+1);
        int[] leftIno=Arrays.copyOfRange(inorder, 0, num1);
        int[] rightIno=Arrays.copyOfRange(inorder, num1+1,num1+num2+1);
        root.left=buildTree(leftPre, leftIno);
        root.right=buildTree(rightPre, rightIno);
        return root;
    }
}

从中序与后序遍历序列构造二叉树

题目
在这里插入图片描述
分析:思路和前者相同,唯一区别的前序遍历变成了后序遍历,3放在了后面。根据根节点再中序遍历中的位置,得到左右子树的节点个数,然后获取四个数组,递归两个子树,最后根据返回的节点建立引用关系。
代码

class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
    	if(postorder.length==0){
        	return null;
        }
        TreeNode root=new TreeNode(postorder[postorder.length-1]);
        int rootNum=0;
        for(int i=0;i<inorder.length;i++){
        	if(inorder[i]==postorder[postorder.length-1]){
        		rootNum=i;
        		break;
        	}
        }
        int num1=rootNum;
        int num2=inorder.length-rootNum-1;
        int[] leftPos=Arrays.copyOfRange(postorder,0, num1);
        int[] rightPos=Arrays.copyOfRange(postorder, num1, num1+num2);
        int[] leftIno=Arrays.copyOfRange(inorder, 0, num1);
        int[] rightIno=Arrays.copyOfRange(inorder, num1+1,num1+num2+1);
        root.left=buildTree(leftIno,leftPos);
        root.right=buildTree( rightIno,rightPos);
        return root;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值