1. 程式人生 > >Leetcode100——判斷兩樹相同——c++版本循序漸進學習

Leetcode100——判斷兩樹相同——c++版本循序漸進學習

老規矩,還是先貼出題面哦~

給定兩個二叉樹,編寫一個函式來檢驗它們是否相同。

如果兩個樹在結構上相同,並且節點具有相同的值,則認為它們是相同的。

示例 1:

輸入:       1         1
          / \       / \
         2   3     2   3

        [1,2,3],   [1,2,3]

輸出: true

示例 2:

輸入:      1          1
          /           \
         2             2

        [1,2],     [1,null,2]

輸出: false

示例 3:

輸入:       1         1
          / \       / \
         2   1     1   2

        [1,2,1],   [1,1,2]

輸出: false

/**
 * 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 isSameTree(TreeNode* p, TreeNode* q) {
     }
};

有了二叉樹的基本操作思想就不難想到,想要儘可能高效的解決二叉樹就必須得使用遞迴。

隨即針對這道題我們不難想到整體思路肯定是一個雙引數的同方向遞迴。但如果遞迴應用的不熟練,會出現以下的情況

 isSameTree(p->left,q->left);

isSameTree(p->right,q->right); 這兩步前後一列就不知道該怎麼處理了,自己想了想思路沒啥問題可就是wa~

這裡的解決方法就是我們需要在返回值中使用遞迴

class Solution {
    
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        
        if(!p&&!q)
            return true;
        else if(p&&!q)
            return false;
        else if(!p&&q)
           return false;
        if(p->val!=q->val)
            return false;
           return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
        
    }
};

再進一步,我們如何將前三行進行合併同時對最後三行進行簡化呢? 我們可以使用如下進階方式~ 

class Solution {
    
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        
        if(!p||!q)
            return p == q;
        
        return p->val==q->val && isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
    }
};

極其巧妙的解決的不同子樹的問題,同時將值、左右遞迴合併!這才叫演算法~