Check if a binary tree is subtree of another binary tree | Set 1(判断一棵二叉树是否是另外一棵二叉树的子树)

Check if a binary tree is subtree of another binary tree | Set 1(判断一棵二叉树是否是另外一棵二叉树的子树)

Q:

给定两棵二叉树,检查第一棵树是否是第二棵树的子树。树T的子树是一棵树S满足下面的条件:由T中的一个节点和T中的所有子节点组成。与根节点对应的子树是整棵树;与任何其他节点对应的子树称为符合条件的子树。

例如,在以下情况下,树S(Tree2)是树T(Tree1)的子树。

        Tree 2
          10  
        /    \ 
      4       6
       \
        30
          
       Tree 1
              26
            /   \
          10     3
        /    \     \
      4       6      3
       \
        30

Solution:

对Tree T 先序遍历。对于遍历中访问的每个节点,查看以该节点为根的子树是否与S相同。

Code:

   static class _1st_4 {

        public static void main(String[] args) {
            _1st_4 handler = new _1st_4();
            TreeNode r1 = TreeNodeIOUtils.transform("[26,10,3,4,6,null,3,null,30,null,null,null,null]");
            // TREE 1
//              26
//             /   \
//            10     3
//           /    \     \
//          4      6      3
//           \
//            30
            
//            // TREE 2
//           10
//         /    \
//         4      6
//          \
//          30
            TreeNode r2 = TreeNodeIOUtils.transform("[10,4,6,null,30,null,null]");
            if (handler.isSubTree(r1, r2))
                System.out.println("Tree 2 is subtree of Tree 1 ");
            else
                System.out.println("Tree 2 is not a subtree of Tree 1");
//
        }

        //判断S是否是T的一棵子树
        public boolean isSubTree(TreeNode T, TreeNode S) {
            if (S == null) return true;//S已经遍历完成
            if (T == null) return false;//T已经遍历完成,但S还有没有走完的节点
            if (areIdentical(T, S)) return true;//是否当前的两棵树是完全一样的
            //T的左子树为根节点和S 对比  || T的右子树为根节点和S 对比
            return isSubTree(T.left, S) || isSubTree(T.right, S);
        }

        //判断r1和r2为根节点的两棵树,是不是完全相同的
        public boolean areIdentical(TreeNode r1, TreeNode r2) {
            if (r1 == null && r2 == null) return true;
            if (r1 == null || r2 == null) return false;
            //判断左右子树是否相同
            return r1.val == r2.val && areIdentical(r1.left, r2.left) && areIdentical(r1.right, r2.right);
        }
    }

Reference

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值