Leetcode第100题 相同的树(迭代) C++解法

1、深度遍历;
深度遍历思路上是用栈;深度遍历迭代我写了得有一个多小时。没办法,不熟,对循环控制也不清晰。在内层循环一开始用q->left还有q->left->val控制,但最后都不行。
除了判断语句省去了nullptr,暂时无法改进了

class Solution
{
public:
    bool isSameTree(TreeNode *p, TreeNode *q)
    {
        if (!q && !p)
            return true;
        stack<TreeNode *> s_p, s_q;
        s_q.push(q);
        s_p.push(p);
        while (!s_q.empty()) //需不要需要用q!=nullptr控制
        {
            while (q && p)
            {
                if (q->val == p->val)
                {
                    s_q.push(q);
                    s_p.push(p);
                    q = q->left;
                    p = p->left;
                }
                else
                    return false;
            }
            if (!q && !p)
            {
                q = s_q.top();
                q = q->right;
                p = s_p.top();
                p = p->right;
                s_p.pop();
                s_q.pop();
            }
            else
                return false;
        }
        return true;
    }
};

想了下只有如此改进了,这样就不用如两次栈了。希望有高人前来指点

        while (!s_q.empty() || q || p ) 

2、广度遍历
广度遍历上是用队列。依旧先用笨蛋解法。
思路上首先是判断对应结点是否值相等,是的话判断它们的左右结点是
①如果子结点均为空,跳过
②如果对应子结点只有一个为空,则返回false
③如果对应子结点都不为空,则入队列
执行完以上后,出队列。
循环语句为队列是否为空。

class Solution
{
public:
    bool isSameTree(TreeNode *p, TreeNode *q)
    {
        if (q == nullptr && p == nullptr)
            return true;
        else
        {
            if (q == nullptr || p == nullptr)
                return false;
        }
        queue<TreeNode *> p_queue, q_queue;
        q_queue.push(q);
        p_queue.push(p);
        while (!q_queue.empty()) //需不要需要用q!=nullptr控制
        {
            q = q_queue.front();
            p = p_queue.front();
            if (q->val == p->val)
            {
                if (q->left != nullptr && p->left != nullptr)
                {
                    q_queue.push(q->left);
                    p_queue.push(p->left);
                }
                else
                {
                    if (q->left != nullptr || p->left != nullptr)
                        return false;
                }
                if (q->right != nullptr && p->right != nullptr)
                {
                    q_queue.push(q->right);
                    p_queue.push(p->right);
                }
                else
                {
                    if (q->right != nullptr ||p->right != nullptr)
                        return false;
                }
                q_queue.pop();
                p_queue.pop();
            }
            else
                return false;
        }
        return true;
    }
};

看了第101题解后,模仿得出以下

class Solution
{
    //广度遍历
public:
    bool isSameTree(TreeNode *p, TreeNode *q)
    {
        if (q == nullptr && p == nullptr)
            return true;
        queue<TreeNode *> p_queue, q_queue;
        q_queue.push(q);
        p_queue.push(p);
        while (!q_queue.empty()) //需不要需要用q!=nullptr控制
        {
            q = q_queue.front();
            q_queue.pop();
            p = p_queue.front();
            p_queue.pop();
            if (!q && !p)
                continue;
            if ((!q || !p) || (q->val != p->val))
                return false;
            q_queue.push(q->left);
            q_queue.push(q->right);
            p_queue.push(p->left);
            p_queue.push(p->right);
        }
        return true;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值