重建二叉树,二叉树的镜像,二叉搜索树的后序遍历

三个问题都是递归问题

1 重建二叉树:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

已知二叉树的中序和先序或者中序和后序,可以还原该二叉树,本例已知先序和中序,先序的第一个元素未二叉树的根节点,找到根节点在中序中的位置,则中序序列中,很节点左边的为左子树,右边为右子树,在先序中找到对应的左右子树的先序遍历,则对左右子树的先序和中序可依次确定左右子树的根节点,递归即可,代码如下:

public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
        return root;
    }
    public TreeNode reConstructBinaryTree(int[] pre,int startPre,int endPre,int[] in,int startIn,int endIn){
        if(startPre>endPre||startIn>endIn){
            return null;
        }
        TreeNode root=new TreeNode(pre[startPre]);
        for(int i=startIn;i<=endIn;i++){
            if(in[i]==pre[startPre]){
                root.left=reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
                root.right=reConstructBinaryTree(pre,startPre+i-startIn+1,endPre,in,i+1,endPre);
            }
        }
        return root;
    }
}

2 二叉树的镜像

操作给定的二叉树,将其变换为源二叉树的镜像。

思路:同样利用递归解决问题,首先将根节点的左右子树镜像,递归左右子树

public class Solution {
    public void Mirror(TreeNode root) {
        if(root!=null)
          {
            TreeNode left=root.right;
            TreeNode right=root.left;
            root.left=left;
            root.right=right;
            if(root.left!=null)//刚开始写错了是把这个if写成while了
            Mirror(root.left);
           if(root.right!=null)//开始时这个也写成while了
            Mirror(root.right);
            
        }
    }
}

3输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

首先要了解二叉搜索树的特点,其任意一个节点的左子树小于根节点值,右子树值大于根节点值,后序遍历时,最后一个节点为根节点,去掉根节点以后,后序数组分为两部分,前一部分为左子树,其值小于根节点,后一部分为右子树,其值大于根节点,且这两段都应满足同样的条件。

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length==0)
            return false;
        if(sequence.length==1)
            return true;
        return IsPostOrder(sequence,0,sequence.length-1);
    }
    public boolean IsPostOrder(int[] sequence,int begin,int end){
        if(begin>=end)
            return true;
        int t=sequence[end];
        int i;
        for(i=begin;i<end;i++){
            if(sequence[i]>=t)
                break;
        }
        int mid=i;
        while(i<end){
            if(sequence[i]<t)
                return false;//如果后一段中出现了小于根节点值的节点,则不是合法的后序序列,否则要依次遍历剩余子序列
            i++;
        }
        return IsPostOrder(sequence,begin,mid-1)&&IsPostOrder(sequence,mid,end-1);//一定要记得更新end坐标
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值