题意:给出两个二叉树,提供算法来判断这两个二叉树是否相同,这里的相同包含树的Node数量及树的结构相同,以及树Node的Value相同
分析:题目很基础 ,就是二叉树的遍历,同时遍历两个二叉树
边界条件:如果两个Node都为空,则为相同;如果两个Node一个为空,则不相同,否则,依据value来判定是否相同。
方法1:代码比较简单的实现就是递归实现,先判断树根Node是否相同,如果相同,则分别判断左、右孩子节点的值,如此递归下去。
bool isSameTree(TreeNode *p, TreeNode *q) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(p == NULL && q == NULL)
{
return true;
}
if(p == NULL || q == NULL)
{
return false;
}
return (p->val == q->val) && isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
此种方式实质上是采用深度遍历的思想。
方法2:用广度遍历的思想,采用循环的方式来遍历二叉树。代码如下:
bool isSameTree(TreeNode *p, TreeNode *q) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (p == NULL && q == NULL)
{
return true;
}
else
{
if (!IsEqualNode(p, q))
{
return false;
}
}
queue<TreeNode *> pQueue = queue<TreeNode *>();
queue<TreeNode *> qQueue = queue<TreeNode *>();
pQueue.push(p);
qQueue.push(q);
while(!pQueue.empty() && !qQueue.empty())
{
TreeNode * pnode = pQueue.front();
TreeNode * qnode = qQueue.front();
pQueue.pop();
qQueue.pop();
if (!IsEqualNode(pnode, qnode))
{
return false;
}
if (pnode->left || qnode->left)
{
pQueue.push(pnode->left);
qQueue.push(qnode->left);
}
if (pnode->right || qnode->right)
{
pQueue.push(pnode->right);
qQueue.push(qnode->right);
}
}
if (pQueue.empty() && qQueue.empty())
{
return true;
}
else
{
return false;
}
}
bool IsEqualNode(TreeNode * p, TreeNode * q)
{
if (p == NULL || q == NULL)
{
if ((p == NULL) ^ (q == NULL))
{
return false;
}
else
{
return true;
}
}
else
{
if(p->val == q->val)
{
return true;
}
else
{
return false;
}
}
}
此方式AC完美通过,耗时16ms。