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.
confused what "{1,#,2,3}" means? >
read more on how binary tree is serialized on OJ.
给定一棵二叉树,判断这个二叉树是否自身左右对称
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isMirror(TreeNode* root1, TreeNode* root2){
if(root1==NULL && root2==NULL)return true;
if(root1==NULL || root2==NULL)return false;
//判断根节点
if(root1->val != root2->val)return false;
//判断root1的左子树和root2的右子树是否镜面对称
if(!isMirror(root1->left, root2->right))return false;
//判断root1的右子树和root2的左子树是否镜面对称
if(!isMirror(root1->right, root2->left))return false;
return true;
}
bool isSymmetric(TreeNode *root) {
if(root==NULL)return true;
return isMirror(root->left, root->right);
}
};
/**
* Definition for binary tree
* 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;
TreeNode*leftPointer = root->left; //遍历左子树的指针
TreeNode*rightPointer = root->right; //遍历右子树的指针
stack<TreeNode*> st_left; //遍历左子树的辅助栈
stack<TreeNode*> st_right; //遍历右子树的辅助栈
//左子树使用先序遍历,右子树使用对称的方式完成先序遍历
while(leftPointer && rightPointer){
if(leftPointer->val != rightPointer->val)return false;
st_left.push(leftPointer);
st_right.push(rightPointer);
leftPointer=leftPointer->left;
rightPointer=rightPointer->right;
}
if(!(leftPointer==NULL && rightPointer==NULL))return false; //如果对称,则leftPointer和rightPointer应该都是NULL
while(!st_left.empty()&&!st_right.empty()){
TreeNode* topLeft=st_left.top(); st_left.pop();
TreeNode* topRight=st_right.top(); st_right.pop();
leftPointer = topLeft->right;
rightPointer = topRight->left;
while(leftPointer && rightPointer){
if(leftPointer->val != rightPointer->val)return false;
st_left.push(leftPointer);
st_right.push(rightPointer);
leftPointer=leftPointer->left;
rightPointer=rightPointer->right;
}
if(!(leftPointer==NULL && rightPointer==NULL))return false; //如果对称,则leftPointer和rightPointer应该都是NULL
}
return st_left.empty()&&st_right.empty();
}
};LeetCode: Symmetric Tree [101],布布扣,bubuko.com
LeetCode: Symmetric Tree [101]
原文地址:http://blog.csdn.net/harryhuang1990/article/details/28092637