题目:
Given two binary trees, write a function to check if they are the same or not.
Two binary trees are considered the same if they are structurally identical and the nodes have the same value.
Example 1:
Input: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3] Output: true
Example 2:
Input: 1 1 / \ 2 2 [1,2], [1,null,2] Output: false
Example 3:
Input: 1 1 / \ / \ 2 1 1 2 [1,2,1], [1,1,2] Output: false
分析:
这道题要求我们判断两棵树是否完全相同,有递归和非递归(用队列)两种方法可以解决,都比较简单,直接上代码吧。
/**
* 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;
// }else if( (!p && q) || ( p && !q ) || ( p->val != q->val )){
// return false;
// }
// return isSameTree( p->left , q->left ) && isSameTree( p->right , q->right );
//非递归解法
if( !isSameNode( p , q )){
return false;
}else if( !p && !q ){
return true;
}
queue<TreeNode*> lqueue;
queue<TreeNode*> rqueue;
lqueue.push(p);
rqueue.push(q);
while( !lqueue.empty() && !rqueue.empty() ){
TreeNode* pNode = lqueue.front();
TreeNode* qNode = rqueue.front();
lqueue.pop();
rqueue.pop();
if( !isSameNode(pNode->left,qNode->left)){
return false;
}else if( pNode->left && qNode->left) {
lqueue.push(pNode->left);
rqueue.push(qNode->left);
}
if( !isSameNode(pNode->right,qNode->right)){
return false;
}else if( pNode->right && qNode->right) {
lqueue.push(pNode->right);
rqueue.push(qNode->right);
}
}
return true;
}
bool isSameNode( TreeNode* p , TreeNode* q ){
if( !p &&!q ){
return true;
}else if( (!p && q) || ( p && !q ) || ( p->val != q->val )){
return false;
}
return true;
}
};