算法笔试-树结构

本文探讨了重建二叉树的方法,通过前序和中序遍历来实现。此外,还涉及二叉树的子结构判断、镜像变换、二叉搜索树后序遍历的验证以及层次遍历的实现,每部分都给出了解题思路。
摘要由CSDN通过智能技术生成

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

public class TreeNode {
//树结构
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x){ val =x ;}
}

    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        TreeNode root=reConstructBinaryTree(pre, 0, pre.length-1, in, 0, in.length-1);
        return root;
    }
    //前序遍历{1,2,4,7,3,5,6,8} 中序遍历{4,7,2,1,5,3,8,6}
    private TreeNode reConstructBinaryTree(int[] pre,int startPre,int endPre,int[] in,int startIn,int endIn){
        if(startPre>endPre||startIn>endIn) return null;
        //搜索将当前子树root结点放到树中
        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, i-startIn+startPre+1, endPre, in, i+1, endIn);
            }

        }
        return root;
    }

2.输入一棵树A,B,判断B是不是A的子结构。ps我们约定空树不是任意一个树的子结构

    public boolean HasSubTree(TreeNode root1,TreeNode root2){
        boolean result=false;
        if(root1!=null && root2!=null){
            if(root1.val==root2.val){
            //从根结点开始比较
                result=DoesTree1HaveTree2(root1, root2);
                //写了一个新方法,不能直接去用本方法递归,会涉及到左右子树和该树的比较
            }
            if(!result){
            //若根结点返回false,判断A的左子树和B是否子结构
                result=HasSubTree(root1.left, root2);
            }
            if(!result){
            //若左子树返回false判断右子树和B是否子结构
                result=HasSubTree(root1.right, root2);
            }
        }
        return result;
    }
    public boolean DoesTree1HaveTree2(TreeNode root1,TreeNode root2){
    //该方法判断root2是否root1的子结构
        if(root1==null && root2 !=null) return false;

        if(root2==null) return true;

        if(root1.val!=root2.val) return false;

        //if(roo1.val==root2.val) 
        //return true;这种写法是否正确???

        return DoesTree1HaveTree2(root1.left, root2.left) && DoesTree1HaveTree2(root1.right, root2.right);

    }

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

    public void Mirror(TreeNode root){

        if(root==null) return;
        //交换左子树右子树的结点
        TreeNode temp=root.left;
        root.left=root.right;
        root.right=temp;
        //递归左子树和右子树
        Mirror(root.left);
        Mirror(root.right); 

    }

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

public boolean VerifySquenceOfBST(int[] sequence){
        if(sequence.length==0) return false;

        return IsTreeBST(sequence,0,sequence.length-1);
    }
    public boolean IsTreeBST(int[] sequence,int start,int end){
        if(end<=start) return true;
        int i=start;
        for(;i<end;i++){
            if(sequence[i] > sequence[end]) break;
        }
        for(int j=i;j<end;j++){
            if(sequence[j] < sequence[end]) return false;
        }

        return IsTreeBST(sequence,start,i-1) && IsTreeBST(sequence,i,end-1);


    }

5.从上往下打印二叉树的每一个结点,同层结点从左往右打印
解题思路:定义一个队列存放结点

public ArrayList<Integer> printFromTop(TreeNode root){
        ArrayList<Integer> result=new ArrayList<Integer>();
        if(root==null) return result;
        Queue<TreeNode> queue=new LinkedList<TreeNode>();
        queue.add(root);

        while(!queue.isEmpty()){
            TreeNode node=queue.poll();//从队列删除第一个元素
            result.add(node.val);
            if(node.left!=null){
                queue.add(node.left);
            }
            if(node.right!=null){
                queue.add(node.right);
            }

        }
        return result;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值