Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1 / 2 2 / / 3 4 4 3
But the following is not:
1 / 2 2 3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
首先递归方法:
bool isChildSymmectric(TreeNode* node1,TreeNode* node2) { if(node1==NULL && node2==NULL) return true; if(node1==NULL || node2==NULL || node1->val!=node2->val) return false; return isChildSymmectric(node1->left,node2->right) && isChildSymmectric(node1->right,node2->left); } bool isSymmetric(TreeNode* root) { if(root==NULL) return true; return isChildSymmectric(root->left,root->right); }
循环方法:把左右子树依次压入到容器中,并一层一层地判断,如果不平衡则立即返回;直至没有新的结点压入到容器中。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool isSymmetric(TreeNode* root) { if(root==NULL) return true; vector<TreeNode*> nodes; nodes.push_back(root); int nodesBegin=0; int nodesEnd=nodes.size(); while(nodesBegin<nodesEnd) { int b=nodesBegin; int e=nodes.size()-1; while(b<e) { if(nodes[b]==NULL && nodes[e]==NULL) { b++; e--; continue; } if((nodes[b]==NULL && nodes[e]) || (nodes[b] && nodes[e]==NULL) || (nodes[b]->val!=nodes[e]->val)) return false; nodes.push_back(nodes[b]->left); nodes.push_back(nodes[b]->right); b++; e--; } while(b<nodesEnd) { if(NULL==nodes[b]) { b++; continue; } nodes.push_back(nodes[b]->left); nodes.push_back(nodes[b]->right); b++; } nodesBegin=nodesEnd; nodesEnd=nodes.size(); } return true; } };