非递归层序遍历法

树的子结构

http://www.nowcoder.com/questionTerminal/6e196c44c7004d15b1610b9afca8bd88

class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if(pRoot2 == nullptr || pRoot1 == nullptr)
        {
            return false;
        }
        queue<TreeNode*> que;             //使用层序遍历
        TreeNode *p1 = pRoot1;
        int sum = 0;
        que.push(p1);
        while(!que.empty())
        {
            p1 = que.front();
            que.pop();
            if(p1->val == pRoot2->val)   //所有相等的都有可能是起点
            {
                sum+=Subtree(p1, pRoot2);
            }
            if(p1->left != nullptr)
            {
                que.push(p1->left);
            }
            if(p1->right != nullptr)
            {
                que.push(p1->right);
            }
        }
        return sum ? true : false;
    }
    int Subtree(TreeNode* pRoot1, TreeNode* pRoot2)  //相同返回1
    { 
        TreeNode *p1 = nullptr,*p2 = nullptr;
        queue<TreeNode*> que1,que2;
        que1.push(pRoot1);
        que2.push(pRoot2);
        while(!que1.empty() && !que2.empty())
        {
            p1 = que1.front();
            p2 = que2.front();

            if(p1->val != p2->val)
            {
                break;
            }
            que1.pop();
            que2.pop();
            if(p2->left != nullptr)  
            {
                que2.push(p2->left);
                if(p1->left != nullptr)
                    que1.push(p1->left);
            }
            if(p2->right != nullptr)
            {
                que2.push(p2->right);
                if(p1->right != nullptr)
                    que1.push(p1->right);
            }
        }
        return que2.empty() ? 1 : 0;
    }
};
全部评论

相关推荐

球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务