您的位置:首页 > 其它

二叉树镜像,对称二叉树的判断-symmetric Tree

2016-02-23 22:01 225 查看

leetcode简单题目:Symmetric Tree的问题

一.通过这道题目我们可以复习以下知识点:

1.1.二叉树的前序,中序,后序遍历方法

二叉树的前序,中序,后序遍历是解决关于树问题的基础内容,代码很简单如下所示:

这里我将二叉树的值存入到相应的vector当中

/**
* Definition for a binary tree node.
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
void preOrder(TreeNode*root,vector<int>&pre)
{
if(root!=NULL)
{
pre.push_back(root->val);
preOrder(root->left,pre);
preOrder(root->right,pre);
}
}
void inOrder(TreeNode*root,vector<int>&in)
{
if(root!= NULL)
{
inOrder(root->left,in);
in.push_back(root->val);
inOrder(root->right,in);
}
}
void postOrder(TreeNode*root,vector<int>&post)
{
if(root!= NULL)
{
postOrder(root->left,post);
postOrder(root->right,post);
post.push_back(root->val);
}
}


1.2.如何唯一确定一颗二叉树

我们知道唯一的确定一颗二叉树有两种遍历方法:

前序+中序;中序+后序

注意:前序+后序方法无法唯一确定一颗二叉树

1.3.二叉树的镜像

二叉树的镜像的题目有很多博客都有讲到这里我给大家一个link:镜像二叉树的构建

二.两种思路讲解:

2.1.二叉树的唯一确定方法+镜像二叉树的构造

思路阐述:

step one:前序,中序遍历二叉树并将遍历结果保存到相应的vector当中

step two:做二叉树镜像操作,并执行step one

step three:比较相应的vector当中的元素顺序是否一致

代码如下:

//方法一:
class Solution {
public:
bool isSymmetric(TreeNode* root)
{
vector<int>pre1,pre2,in1,in2;
preOrder(root,pre1);
inOrder(root,in1);
iso(root);
preOrder(root,pre2);
inOrder(root,in2);
for(int i=0;i<pre1.size();i++)
{
if(pre1[i]!=pre2[i]||in1[i]!=in2[i])
{
return false;
}
}
return true;
}
void preOrder(TreeNode*root,vector<int>&pre)
{
if(root!=NULL)
{
pre.push_back(root->val);
preOrder(root->left,pre);
preOrder(root->right,pre);
}
}
void inOrder(TreeNode*root,vector<int>&in)
{
if(root!= NULL)
{
inOrder(root->left,in);
in.push_back(root->val);
inOrder(root->right,in);
}
}
void iso(TreeNode*root)
{
if(!root)
{
return ;
}
TreeNode*temp=root->left;
root->left=root->right;
root->right=temp;
iso(root->left);
iso(root->right);
}
};


2.2.递归遍历二叉树并进行值得比较

简单思路阐述:

这种方法是一种最为普遍的方法,也有助于我们更好的复习递归操作,主要是自顶向下的顺序进行二叉树判断:二叉树的左子树->左子树与二叉树的右子数->右子树以及二叉树左子树->右子树与二叉树的右子树->左子树的递归比较操作,

代码如下:

//方法二:
class Solution {
public:
bool isSymmetric(TreeNode *root)
{
if(!root)
return true;
return isSymmetric(root->left,root->right);
}
bool isSymmetric(TreeNode *left, TreeNode *right)
{
if (!left && !right)
return true;
if (!left || !right)
return false;
return left->val == right->val && isSymmetric(left->left, right->right)&& isSymmetric(left->right, right->left);
}
};


三.总结

二叉树的知识是树这一章节的基本知识,并且与二叉树相关的概念很多,因此二叉排序树、线索树,以及和链表关联的题目琳琅满目。所有的题目都来源于生活,出自于基本知识点。希望与大家把所有的知识点活灵活用,解决更多的问题,大家一同努力!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: