递归:两个对称的节点同时走即可。
迭代:用队列,每一次 push 两个节点,这两个节点是对称的!
// 递归 class Solution { public: bool isSymmetric(TreeNode* root) { return _isSymmetric(root, root); } bool _isSymmetric(TreeNode *node1, TreeNode *node2) { if(node1 == nullptr || node2 == nullptr) { return node1 == node2; } if(node1 -> val != node2 -> val) return false; bool res = _isSymmetric(node1 -> left, node2 -> right); res &= _isSymmetric(node1 -> right, node2 -> left); return res; } };
// 迭代 class Solution { public: bool isSymmetric(TreeNode* root) { if(!root) return false; queue<TreeNode *> que; que.push(root -> left); que.push(root -> right); while(!que.empty()) { // 取出的 p 和 q 是对称点 auto p = que.front(); que.pop(); auto q = que.front(); que.pop(); if((!p && q) || (p && !q)) return false; // 一个为 nullptr, 另一个不为 nullptr if(!p) continue; // 两个都为 nullptr if(p -> val != q -> val) return false; que.push(p -> left); que.push(q -> right); que.push(p -> right); que.push(q -> left); } return true; } };