题目描述
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1 2 3 4 5
| 1 / \ 2 2 / \ / \ 3 4 4 3
|
来源:LeetCode
解法一
给定一个根节点,如何判断左右子树对称,设计一个递归函数,传递左右子树的根节点到递归函数,返回值是这两颗子树是否相等。在函数里,每次只比较两个子树的根节点是否相等,剩下的交给函数递归求解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
class Solution { public: bool isSymmetric(TreeNode* root) { if(!root) return true; return helper(root->left, root->right); }
bool helper(TreeNode * left, TreeNode * right) { if(!left && !right) return true; if(!left || !right) return false; if(left->val != right->val) return false; return helper(left->left, right->right) && helper(left->right, right->left); } };
|
解法二
既然对称的树,每一层都是符合对称的规则,那么能不能按照逐层判断的方式,层次遍历,每一层判断过程中,如果检测到不对称,则立即返回,如果最后遍历完,仍然没有不对称的,则说明树是对称的。
注意:此处push到队列的后续节点,可以是null,null是参与比较是否对称的。而一般的二叉树层次遍历只输出非null的节点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
class Solution { public: bool isSymmetric(TreeNode* root) { if(!root) return true; queue<TreeNode*> q; q.push(root->left); q.push(root->right); while(!q.empty()) { TreeNode *node1 = q.front(); q.pop(); TreeNode *node2 = q.front(); q.pop(); if(!node1 && !node2) continue; if(!node1 || !node2) return false; if(node1->val != node2->val) return false; q.push(node1->left); q.push(node2->right); q.push(node1->right); q.push(node2->left); } return true; } };
|