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;
}
};