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);
}
};
三.總結
二叉樹的知識是樹這一章節的基本知識,並且與二叉樹相關的概念很多,因此二叉排序樹、線索樹,以及和鏈表關聯的題目琳琅滿目。所有的題目都來源於生活,出自於基本知識點。希望與大家把所有的知識點活靈活用,解決更多的問題,大家一同努力!