Leetcode 101. 對稱二叉樹 遞歸和迭代。

題目

在這裏插入圖片描述

遞歸

遞歸的思想首先判斷是哪種遍歷方式,這道題應該是前序遍歷,因爲要從根節點開始,那麼依次判斷根的左節點和右節點是否相等。

  1. 前序遍歷
  2. 遞歸的結構 dfs(root1->left,root2->right), dfs(root1->right,root2->left)
  3. 遞歸結束的條件
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root == NULL)
            return true;
        bool res = func(root,root);
        return res;
    }
    
    bool func(TreeNode* root1,TreeNode* root2)
    {
        if(root1 == NULL && root2 == NULL)
            return true;
        if(root1==NULL || root2==NULL)
            return false;
        if(root1->val != root2->val)
            return false;
        bool left = func(root1->left,root2->right);
        bool right = func(root1->right,root2->left);
        
        return left&&right;
    }
};

迭代

迭代我們可以使用bfs的方式,層序遍歷對於每一層我們調用判斷迴文的函數。從而可以實現迭代的方法。

另一種迭代方式我們可以兩兩入隊,出隊保證比較的元素剛好是對稱位置上的,如下代碼所示:

class Solution {
public:
     bool isSymmetric(TreeNode* root) {
        if (root == NULL) {
            return true;
        }
        
        queue<TreeNode*> queue;
        queue.push(root->left);
        queue.push(root->right);

        while (!queue.empty()) {
            TreeNode* node1 = queue.front();
            queue.pop();
            TreeNode* node2 = queue.front();
            queue.pop();
            if (node1 == NULL && node2 == NULL) {
                continue;
            }
            if (node1 == NULL || node2 == NULL || node1->val != node2->val) {
                return false;
            }
            queue.push(node1->left);
            queue.push(node2->right);
            queue.push(node1->right);
            queue.push(node2->left);
        }

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