题目链接:www.nowcoder.com/practice/1b…
题解:需要判断左右子树是否对称,采用递归的方式去写,left和right是对称的。
感觉需要提前想好算法,再去写
方法一:递归(dfs)方式实现
class Solution {
public:
bool judge(TreeNode* treeLeft,TreeNode* treeRight) {
if(treeLeft == nullptr && treeRight == nullptr) return true;
if(treeLeft == nullptr && treeRight != nullptr) return false;
if(treeLeft != nullptr && treeRight == nullptr) return false;
if(treeLeft->val != treeRight->val) return false;
return judge(treeLeft->left, treeRight->right)&&judge(treeLeft->right, treeRight->left);
}
bool isSymmetric(TreeNode* root) {
// write code here
if(root == nullptr) return true;
return judge(root->left, root->right);
}
};
方法二:迭代算法,利用queue实现
class Solution {
public:
bool isSymmetric(TreeNode* root) {
// write code here
if(root == nullptr) return true;
queue<TreeNode*> leftTree,rightTree;
leftTree.push(root->left);
rightTree.push(root->right);
while(!leftTree.empty() && !rightTree.empty()) {
//把节点取出
TreeNode *leftTreeNode,*rightTreeNode;
leftTreeNode = leftTree.front(), leftTree.pop();
rightTreeNode = rightTree.front(), rightTree.pop();
//如果都为空,跳过;如果一方为空,一方不为空,返回false,如果值不同,返回false
if(leftTreeNode == nullptr && rightTreeNode == nullptr) {
continue;//都为空
}
if(leftTreeNode == nullptr && rightTreeNode != nullptr) {
return false;
}
if(leftTreeNode != nullptr && rightTreeNode == nullptr) {
return false;
}
if(leftTreeNode->val != rightTreeNode->val) {
return false;
}
leftTree.push(leftTreeNode->left), leftTree.push(leftTreeNode->right);
rightTree.push(rightTreeNode->right), rightTree.push(rightTreeNode->left);
}
if(!leftTree.empty()||!rightTree.empty()) return false;
return true;
}
};