首页 > 代码库 > LeetCode: Symmetric Tree [101]
LeetCode: Symmetric Tree [101]
【题目】
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(); } };
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。