此题就是考的细,原理上不难,还是递归,那么遍历顺序是啥,答案就是后序遍历,有人结合代码看可能不理解,觉得这明明是前序遍历啊,先判断节点,再对左右节点进行递归。这是一个误导,还有就是这次写的代码可读性比较差,那么为啥是后序遍历呢,因为他是先递归然后再判断是否相等。所以是后续遍历。反正核心思想就是:比较外侧是否相等,在比较内称是否相等,都相等就对称。
其次这道题的终止条件也要明确。一共有一下五点,写的时候可以简化。
1.左为空,右不为空 false
2.左不为空,有为空 false
3.左右都为空 true
4.左右都不为空,比较节点数值不相同 false
5.相同就是 true 执行递归逻辑
以上就是这道题的全部思路剩下就是开干。
class Solution {
public:
bool check(TreeNode* left, TreeNode* right){
// 首先排除空节点的情况
if(left == NULL && right == NULL) return true;
if (left == NULL || right == NULL) return false;
return (left->val == right->val) && check(left->left, right->right) && check(left->right, right->left);
}
bool isSymmetric(TreeNode* root) {
return check(root, root);
}
};
刚才看了个神奇的思路,分享一下。
其实原理是一样的,但人家就是说的让你茅塞顿开hhh。
原文:https://www.cnblogs.com/lzyrookie/p/14674370.html