给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3]
是对称的。
1 / 2 2 / \ / 3 4 4 3
但是下面这个 [1,2,2,null,3,null,3]
则不是镜像对称的:
1 / 2 2 \ 3 3
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
本题可用递归和迭代两种做法来求解。
递归做法是每次对于对称的两个节点,首先判断是否都为空,若都为空则返回true;否则判断两节点是否相等,若相等则返回它们对应的子节点的比较结果;否则返回false。
迭代做法是维护一个节点队列,每次取出队列头部两个节点比较其是否相等,若不相等且两节点均不为空,则依次把两个节点对称位置的子节点加入到队列中,注意null也要加入到队列;否则返回false
递归:
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */10 class Solution {11 public:12 bool isSymmetric(TreeNode* root) {13 if(root == NULL) return true;14 return symmetric(root->left, root->right);15 }16 bool symmetric(TreeNode* left, TreeNode* right){17 if(left == right) return true;18 else if(left && right && left->val == right->val){19 if(symmetric(left->left, right->right) && symmetric(left->right, right->left)) 20 return true;21 }22 return false;23 }24 };
迭代:
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */10 class Solution {11 public:12 bool isSymmetric(TreeNode* root) {13 if(root == NULL) return true;14 queue<TreeNode*> q;15 q.push(root->left);16 q.push(root->right);17 while(q.size()){18 TreeNode* node1 = q.front();19 q.pop();20 TreeNode* node2 = q.front();21 q.pop();22 if(node1 && node2){23 if(node1->val != node2->val) return false;24 else{25 q.push(node1->left);26 q.push(node2->right);27 q.push(node1->right);28 q.push(node2->left);29 }30 }31 else if(node1 || node2) return false;32 }33 return true;34 }35 };
来源:http://www.icode9.com/content-4-46001.html
联系客服