1. 程式人生 > >LeetCode101——對稱二叉樹——c++版本實現

LeetCode101——對稱二叉樹——c++版本實現

題面來啦~

給定一個二叉樹,檢查它是否是映象對稱的。

例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

但是下面這個 [1,2,2,null,3,null,3] 則不是映象對稱的:

    1
   / \
  2   2
   \   \
   3    3

/**  * Definition for a binary tree node.  * struct TreeNode {  *     int val;  *     TreeNode *left;  *     TreeNode *right;  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}  * };  */

class Solution { public:

bool isSymmetric(TreeNode* root) {

    } };

如果還沒有看我的前一篇Leetcode100的朋友請先去看那篇哦~ 強烈建議先100後101,101這道題可以有效檢驗你是否學會了如100這種二叉樹的遞迴操作思想! 

如果看過了100的話,我們就開始講解啦~

其實思路很簡單,根據映象的定義,不過是在遍歷的時候設定兩個指標,一個向左一個向右同時遍歷,並逐步比對。

但我們發現這道題的函式只有根節點,那帶一個雙參的子函式就可以完美解決啦~ 下面給出程式碼哦

要注意的是,根節點的子節點情況我選擇在原始函式中給出判斷,這樣方便子函式安安心心的往下遍歷~

class Solution {
public:
    bool search(TreeNode* r1,TreeNode* r2)
    {
        if(r1&&r2)
        return r1->val==r2->val&&search(r1->left,r2->right)&&search(r1->right,r2->left);
        
        else if((r1&&!r2)||(!r1&&r2))
            return false;
        else return true;
    }
    
    bool isSymmetric(TreeNode* root) {
        
        if(!root)
            return true;
        if(!root->left&&!root->right)
            return true;
        if((!root->left&&root->right)||(root->left&&!root->right))
            return false;
        return search(root->left,root->right);
        
    }
};