您的位置:首页 > 其它

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

2017-11-08 19:02 288 查看
分析:本题是2010年微软校园招聘的一道题目。我们主要是利用二叉树的前序遍历算法(可有其他的便利算法实现)来将节点之间依次匹对,代码如下:

/**

public class TreeNode {

    int val = 0;

    TreeNode left = null;

    TreeNode right = null;

    public TreeNode(int val) {

        this.val = val;

    }

}

*/

public class Solution {

    public boolean l=false;

    public boolean r=false;

    public boolean h=false;

    public boolean flag=true;//使用flag来进行标记是否是头结点进行比对

    public boolean HasSubtree(TreeNode root1,TreeNode root2) {

        if((root1==null && root2!=null) ||((root1!=null && root2==null)&& flag)

           || ((root1==null && root2==null)&& flag)){

            return  false;

        }else if((root1==null && root2 ==null)  ||  (root1!=null && root2==null)){

            return true;

        }else if(root1.val ==root2.val){

            flag=false;

            //查找root2的左子树是否满足条件

            l= HasSubtree(root1.left,root2.left);

            //查找root2的右子树是否满足条件

            if(l){

            //左节点满足条件,判断右节点

            r= HasSubtree(root1.right,root2.right);

            }

            if(r){

             //右节点满足条件

                return true;

            }

        }else if(root1.val !=root2.val){

            return false;

        }

        if(root1 !=null && root2 !=null){

            flag=false ;

           //查找root2是否是root1左子树的子结构

            h= HasSubtree(root1.left,root2);

            if(!h){

           //查找root2是否是root1右子树的子结构

            h= HasSubtree(root1.right,root2);

            }

        }

        return h;

            

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐