【剑指Offer】二叉树——子树匹配

package cn.dzp.flyroc.offer;


public class HasSubTreeDemo {

        /* 题目描述:输入两颗二叉树A,B。
        判断B是否是A的子结构。(约定空树不是任何一个树的子结构)*/

        /* 思路:若根节点相同,利用递归比较他们的子树是否相同;
        若根节点不一样,则利用递归分别在左右子树中查找。*/


        //代码实现
     static class TreeNode {       //构建TreeNode类

            int val;    //节点值
            TreeNode left;      //构建左子树
            TreeNode right;     //构建右子树

            //构造函数
            TreeNode(int val) {

                this.val = val;
            }
        }

        //判断A,B两树的根节点是否相同
    public  boolean rootEquire(TreeNode rootA, TreeNode rootB){

         //定义一个初始标记
        boolean result = false;

        //判断A,B两树是否为空
        if (rootA != null && rootB != null){

            //判断A,B两树的根节点值是否相等
            if (rootA.val == rootB.val){

                //以A树的根节点为起点,与B树一一比较
                result = nodeEquire(rootA,rootB);
            }

            //若是A,B两树的根节点不一样,就去A树的左右子树找是否有与B树相同的结构
            if (!result){

                return rootEquire(rootA.left ,rootB) || rootEquire(rootA.left ,rootB);
            }
        }
        System.out.println("B树不是A树的子树");
        return result;
    }

    //判断A,B两树的子树是否相同
    public static boolean nodeEquire(TreeNode nodeA, TreeNode nodeB) {

         //treeB全度遍历完了,且一一对应
        if (nodeB == null){

            System.out.println("B数是A数的子树");
            return true;
        }


        //treeA全都遍历完,treeB还没遍历完
        if (nodeA == null){

            System.out.println("B树不是A树的子树");
            return false;
        }

        //若是某处的节点值不一样
        if (nodeA.val != nodeB.val){

            System.out.println("B树不是A树的子树");
            return false;
        }

        //若是根节点对应上,就去子树中匹配
        return nodeEquire(nodeA.left,nodeB.left) && nodeEquire(nodeA.right, nodeB.right);
    }
}
相关文章
相关标签/搜索