百度2016实习笔试:判断二叉树B是否是A的子结构

问题

输入两颗二叉树A,B,判断B是不是A的严格子结构。注意严格子结构值得是左子树或右子树中的结构。是则返回1,否则返回-1。

该题为剑指offer面试题18的变种:输入两颗二叉树A,B,判断B是不是A的子结构。可以从树A的根节点开始判断。是则返回true,否则返回false。

分析:要查找树A中是否存在和树B结构一样的子树,可以分成2步:

  1. 在树A中找打耦合B的根节点的值一样的节点R;
  2. 判断树A中以R为根节点的子树是不是包含和树B一样的结构;
  3. 递归调用判断;

剑指offer例程:利用逻辑或的短路性可以避免多次if语句。

/** * 输入两颗二叉树A,B,判断B是不是A的子结构。 * @param root1 A的根节点 * @param root2 B的根节点 * @return */
    public boolean hasSubTree(TreeNode root1, TreeNode root2) {
        if (root1 == null || root2 == null)
            return false;
        // 递归前序遍历树A的结点判断B是不是A的子树
        // 如果在树A的根节点处判断不成立,则递归判断树A的左右子节点
        return isSubTree(root1, root2) || 
                hasSubTree(root1.left, root2) || 
                hasSubTree(root1.right, root2);
    }

    public boolean isSubTree(TreeNode root1, TreeNode root2) {
        // 此处必须先判断root是否为空,否则无法通过所有用例
        if (root2 == null)
            return true;
        if (root1 == null)
            return false;
        if (root1.val != root2.val)
            return false;
        return isSubTree(root1.left, root2.left) && isSubTree(root1.right, root2.right);
    }

回到百度的笔试题,题中需要判断严格子结构,并且返回值为-1或者1,不能直接利用逻辑或的短路性。但是可以在写一个新的函数,调用剑指offer的例程,由于判断严格子结构,则hasSubTree函数中的return语句去除用于树A根节点判断的isSubTree部分即可。

百度完整例程:

    public int judgeSubTree(TreeNode root1, TreeNode root2) {
        if (root1 == null || root2 == null)
            return -1;
        // 调用剑指offer修改后的例程
        boolean isSub = hasSubTree(root1, root2);
        if(isSub)
            return 1;
        else
            return -1;
    }


/** * 输入两颗二叉树A,B,判断B是不是A的子结构。 * @param root1 A的根节点 * @param root2 B的根节点 * @return */
    public boolean hasSubTree(TreeNode root1, TreeNode root2) {
        if (root1 == null || root2 == null)
            return false;
        // 严格子结构,直接递归判断树A的左右子节点
        return hasSubTree(root1.left, root2) || 
                hasSubTree(root1.right, root2);
    }

    public boolean isSubTree(TreeNode root1, TreeNode root2) {
        // 此处必须先判断root是否为空,否则无法通过所有用例
        if (root2 == null)
            return true;
        if (root1 == null)
            return false;
        if (root1.val != root2.val)
            return false;
        return isSubTree(root1.left, root2.left) && isSubTree(root1.right, root2.right);
    }

注意

  1. 注意问题中需要判断的是严格子结构和是子结构;
  2. isSubTree函数中必须先对root2是否为空进行判断,如果为空,直接返回true;
  3. 有关于树的遍历时,一定要注意边界条件的检查,即null空指针的检查,并且定义相应的输出,否则无法通过所有测试用例,程序很可能崩溃。

目录

  • 问题
  • 注意
  • 目录

你可能感兴趣的:(二叉树,百度,剑指offer,子结构)