给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
题解一:(递归)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q)
{
/* //递归
if (!p && !q)
return true;
if (!p || !q)
return false;
return p->val == q->val && (isSameTree(p->left, q->left)) && (isSameTree(p->right, q->right));
}
};
题解二:(用双端队列迭代)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q)
{
// 通过双端队列迭代
if (!check(p, q))
return false;
queue<TreeNode *> p_queue, q_queue;
p_queue.push(p);
q_queue.push(q);
while (!p_queue.empty())
{
p = p_queue.front();
q = q_queue.front();
p_queue.pop();
q_queue.pop();
if (p != NULL) // 如果结点不为空,则将结点的左右孩子入队列
{
if (check(p->left, q->left))
{
p_queue.push(p->left);
q_queue.push(q->left);
}
else
return false;
if (check(p->right, q->right))
{
p_queue.push(p->right);
q_queue.push(q->right);
}
else
return false;
}
}
return true;
}
bool check(TreeNode* p, TreeNode* q)
{
if (p == NULL && q == NULL)
return true;
if (p == NULL || q == NULL)
return false;
if (p->val != q->val)
return false;
else
return true;
}
};