【题目】
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); } };
【思路2】
非递归实现(先序遍历实现)
【代码】
/** * 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]
时间: 2024-10-06 00:39:57