二叉樹鏡像,對稱二叉樹的判斷-symmetric Tree

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);
    }
};

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章