题目:
- 给你一个二叉树的根节点
root
, 检查它是否轴对称。
示例:
- 输入: r o o t = [ 1 , 2 , 2 , 3 , 4 , 4 , 3 ] root = [1,2,2,3,4,4,3] root=[1,2,2,3,4,4,3]
- 输出: t r u e true true
解题思路一:(递归)
分别递归外侧是否相同,内侧是否相同,只有当外侧与内侧同时相同才返回true
,否则返回false
。
- 确定递归函数的参数和返回值:
bool compare(TreeNode* leftNode, TreeNode* rightNode);
- 确定终止条件:
if(leftNode == NULL && rightNode != NULL) return false;
else if(leftNode != NULL && rightNode == NULL) return false;
else if(leftNode == NULL && rightNode == NULL) return true;
else if(leftNode->val != rightNode->val) return false;
- 确定单层递归逻辑: 先序遍历顺序为: 左 − > 中 − > 右 左->中->右 左−>中−>右
bool out = compare(leftNode->left, rightNode->right);
bool in = compare(leftNode->right, rightNode->left);
return out && in;
C++版整体代码
class Solution {
public:
bool compare(TreeNode* leftNode, TreeNode* rightNode){
if(leftNode == NULL && rightNode != NULL) return false;
else if(leftNode != NULL && rightNode == NULL) return false;
else if(leftNode == NULL && rightNode == NULL) return true;
else if(leftNode->val != rightNode->val) return false;
bool out = compare(leftNode->left, rightNode->right);
bool in = compare(leftNode->right, rightNode->left);
return out && in;
}
bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;
return compare(root->left, root->right);
}
};
Java版整体代码
class Solution {
public boolean isSame(TreeNode leftNode, TreeNode rightNode){
if(leftNode != null && rightNode == null) return false;
else if(leftNode == null && rightNode != null) return false;
else if(leftNode == null && rightNode == null) return true;
else if(leftNode.val != rightNode.val) return false;
return isSame(leftNode.left, rightNode.right) && isSame(leftNode.right, rightNode.left);
}
public boolean isSymmetric(TreeNode root) {
if(root == null) return true;
return isSame(root.left, root.right);
}
}
解题思路二:(迭代)
先将左右节点加入队列中,判断 ① 若左右节点都为空,则对称,返回true ② 若(左空右不空)||(左不空右空)||(左右节点值不同)则返回false。然后依次加入左左、右右、左右、右左节点再次进行判断。
C++实现版本
class Solution {
public:
bool isSymmetric(TreeNode* root) {
queue<TreeNode*> q;
if(!root){
q.push(root->left);
q.push(root->right);
}
while(!q.empty()){
TreeNode* leftNode = q.front();
q.pop();
TreeNode* rightNode = q.front();
q.pop();
// 若左右节点都为空,则对称,返回true
if(!leftNode && !rightNode) return true;
// 若(左空右不空)||(左不空右空)||(左右节点值不同)则返回false
if(!leftNode || !rightNode || leftNode->val != rightNode->val) return false;
q.push(leftNode->left);
q.push(rightNode->right);
q.push(leftNode->right);
q.push(rightNode->left);
}
return true;
}
};