• 题目描述:

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

  • 分析:

    基本思想是分两步:

    1. 遍历树A,先找到A中与B的根值相等的结点R;
    2. 然后再判断树A中以R为根结点的子树是不是包含和树B一样的结构。

    显然这两部过程中都需要遍历二叉树,而二叉树的遍历一般用递归完成。第一步在树A中查找与树B根结点的值一样的结点,实际就是树的遍历:

    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        bool result = false;
        
    	if(pRoot1 != NULL && pRoot2 != NULL){
            if(pRoot1->val == pRoot2->val)
            	result = DoesTree1HaveTree2(pRoot1,pRoot2);
            if(!result)
                result = HasSubtree(pRoot1->left,pRoot2);
            if(!result)
                result = HasSubtree(pRoot1->right,pRoot2);
        }
        return result;
    }
    

    第二步是判断A中以R为根结点的子树是不是和树B有相同的结构。同样也是递归的思路:如果结点R的值和树B的根结点不同,则两者不具有相同的结点;如果值相同,则递归的判断它们各自的左右结点的值是不是相同。递归的终止条件是我们到达了树A或者树B的叶结点。

    bool DoesTree1HaveTree2(TreeNode* pRoot1,TreeNode* pRoot2){
        if(pRoot2 == NULL) return true;
    	if(pRoot1 == NULL) return false;
        if(pRoot1->val != pRoot2->val)
            return false;
        return DoesTree1HaveTree2(pRoot1->left,pRoot2->left)
            && DoesTree1HaveTree2(pRoot1->right,pRoot2->right);
    }
    
 posted on 2017-05-04 14:59  Bill_LHR  阅读(241)  评论(0编辑  收藏  举报