题目描述
看到这题就知道要用递归,哎,最讨厌二叉树的题,就是因为不理解递归。有什么办法呢,越是不会越要学会,硬着头皮做吧。emmm,想了10分钟,不会。。算了,直接看评论吧,于是我看到了一长段话,如下:
根据提示,我开始写代码,附上本人的辣鸡代码
class Solution {
public:
bool judge(TreeNode* l , TreeNode* r){
if(l == NULL && r == NULL) return true;
if(l == NULL && r != NULL) return false;
if(l != NULL && r == NULL) return false;
if(l->val != r->val) return false;
return judge(l->left , r->right) && judge(l->right , r->left);
}
bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;
return judge(root->left , root->right);
}
};
妙啊,我居然写出来了(写出来才发现算法如此简单),哈哈哈,本来还准备直接看人家的代码,多谢写评论的大哥
代码调整一下能更快
class Solution {
public:
bool judge(TreeNode* l , TreeNode* r){
if(!l && !r) return true;//都为空
if(!l || !r) return false;//有一个为空
return l->val == r->val && judge(l->left , r->right) && judge(l->right , r->left);
}
bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;
return judge(root->left , root->right);
}
};
广度优先方法(队列实现)
bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;
queue<TreeNode*> q;
q.push(root->left);
q.push(root->right);
while(!q.empty()){
TreeNode* l = q.front();
q.pop();
TreeNode* r = q.front();
q.pop();
if(!l && !r) continue;//结点都空时,后面再放入孩子结点则报错,直接下一次循环,取队列中的结点
if(!l || !r) return false;//只有一个结点为空时
if(l->val != r->val) return false;
q.push(l->left);
q.push(r->right);
q.push(r->left);
q.push(l->right);
}
return true;
}
相同二叉树
解法和上述一模一样
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);
}