码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer-树的子结构

时间:2016-08-15 14:30:20      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

题目描述

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

技术分享

 

/**
     * 基本思路:1.判断树A和树B是否有相同的根结点 2.如果存在,判断A的子树是否和B树结构相同 3.如果不存在,A树向下遍历,重复步骤1,2
     * 注意null的条件,hasSubTree中,如果两棵树都不为空才进行判断,
     * doesTree1HasTree2中,如果B树为空,则说明B树遍历完了,即匹配成功,
     * A树为空有两种情况(1)如果A树为空&&B树不为空说明不匹配,
     *                 (2)如果A树为空,B树为空,说明匹配。
     * @param root1 A树
     * @param root2 B树
     * @return
     */
    public boolean hasSubTree(BinaryTreeNode root1, BinaryTreeNode root2) {

        boolean result = false;
        if (root1 != null && root2 != null) {
            // 根节点相等,递归判断A中的以某个节点为根节点的子树是不是和树B具有相同的结构
            if (root1.value == root2.value) {
                result = doesTree1HasTree2(root1, root2);
            }
            // 未匹配成功,A树向左子树递归查找与B树根节点相等的根结点
            if (!result) {
                result = hasSubTree(root1.left, root2);
            }
            // 未匹配成功,A树向右子树递归查找与B树根节点相等的根结点
            if (!result) {
                result = hasSubTree(root1.right, root2);
            }

        }
        return result;

    }

    private boolean doesTree1HasTree2(BinaryTreeNode root1, BinaryTreeNode root2) {

        // 递归到root2为空,说明B树是A树的子树
        if (root2 == null)
            return true;
        
        if (root1 == null) {
            return false;
        }
        // 结点值不相同,肯定不是子树
        if (root1.value != root2.value) {
            return false;
        }

        return doesTree1HasTree2(root1.left, root2.left)
                && doesTree1HasTree2(root1.right, root2.right);
    }

 

剑指offer-树的子结构

标签:

原文地址:http://www.cnblogs.com/zywu/p/5772619.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!