力扣刷題筆記(10)

emmm,本次就兩題,因爲我刷的那部分就五題樹的。。

其實還是有點迷惑,我做完有個好習慣,去看那些運行速度比我快的代碼。但是最近看到的都是,代碼跟我寫一樣,速度怎麼就有差那麼多,最奇葩的一個是人家4ms,我就400ms,哎。

不牢騷了,切正題。

題目(1):二叉樹的層序遍歷

給你一個二叉樹,請你返回其按 層序遍歷 得到的節點值。 (即逐層地,從左到右訪問所有節點)。

示例:
二叉樹:[3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其層次遍歷結果:

[
  [3],
  [9,20],
  [15,7]
]

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。


題目(2):有序數組轉化成平衡搜索二叉樹

將一個按照升序排列的有序數組,轉換爲一棵高度平衡二叉搜索樹。

本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。

示例:

給定有序數組: [-10,-3,0,5,9],

一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜索樹:

      0
     / \
   -3   9
   /   /
 -10  5

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。


我的題解(1)(帶圖解釋)

哎,好久不畫圖了,這題,中等題呢,雖然我是一遍過,所以我更要畫一下圖講一下我的思路。

在這裏插入圖片描述
一目瞭然吧!

int maxDepth(TreeNode* root) {
    if (root == NULL)
        return 0;
    return 1 + max(maxDepth(root->left), maxDepth(root->right));
}

void temp(vector<TreeNode*>& tree, vector<vector<int>>& ret, int tree_count, int ret_count)    //將節點容器和返回值容器傳入進行迭代
{
    int sz = tree.size();

    int push_flag = 0;

    for (; tree_count < sz; tree_count++)
    {
        if (tree[tree_count]->left != NULL)
        {
            ret[ret_count].push_back(tree[tree_count]->left->val);
            tree.push_back(tree[tree_count]->left);
            push_flag = 1;
        }
        if (tree[tree_count]->right != NULL)
        {
            ret[ret_count].push_back(tree[tree_count]->right->val);
            tree.push_back(tree[tree_count]->right);
            push_flag = 1;
        }
 //       tree_count++;
    }

    if (push_flag)
    {
        ret_count++;
        temp(tree, ret, tree_count, ret_count);
    }
}

vector<vector<int>> levelOrder(TreeNode* root) 
{
    int z = maxDepth(root);
    vector<vector<int>> ret(z);
    if (root == NULL)
        return ret;

    vector<TreeNode*> tree;
    tree.push_back(root);

    ret[0].push_back(root->val);

    temp(tree,ret,0,1);
    return ret;
}

因爲要將數據取出來,所以長了些,需要先知道高度嘛。


我的題解(2)多種思路

看這個題啊,真是思緒萬千,什麼二分法啊、中序遍歷啊都出來了,畢竟是有序嘛。

思路一:中序遍歷

在這裏插入圖片描述

思路二:二分法

圖我就不畫了,如果快排不會的朋友可能理解起來就比較費勁了。那就去溫習一下快排吧。

TreeNode* temp(vector<int>& nums, int start, int end) 
{
    if (start <= end) 
    {
        int mid = (start + end) / 2;
        TreeNode *root = new TreeNode(nums[mid]);
        root->left = temp(nums, start, mid - 1);
        root->right = temp(nums, mid + 1, end);
        return root;
    }
    else 
    {
        return NULL;
    }
}

TreeNode* sortedArrayToBST(vector<int>& nums) 
{
    int sz = nums.size();

    if (sz == 0)
        return NULL;
    
    return temp(nums,0,sz-1);
}

簡單明瞭啊!


官方題解(1)

方法 1:遞歸
算法

最簡單的解法就是遞歸,首先確認樹非空,然後調用遞歸函數 helper(node, level),參數是當前節點和節點的層次。程序過程如下:

輸出列表稱爲 levels,當前最高層數就是列表的長度 len(levels)。比較訪問節點所在的層次 level 和當前最高層次 len(levels) 的大小,如果前者更大就向 levels 添加一個空列表。
將當前節點插入到對應層的列表 levels[level] 中。
遞歸非空的孩子節點:helper(node.left / node.right, level + 1)。

作者:LeetCode
鏈接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/er-cha-shu-de-ceng-ci-bian-li-by-leetcode/
來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

python寫的

class Solution:
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        levels = []
        if not root:
            return levels
        
        def helper(node, level):
            # start the current level
            if len(levels) == level:
                levels.append([])

            # append the current node value
            levels[level].append(node.val)

            # process child nodes for the next level
            if node.left:
                helper(node.left, level + 1)
            if node.right:
                helper(node.right, level + 1)
            
        helper(root, 0)
        return levels

> 作者:LeetCode
> 鏈接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/er-cha-shu-de-ceng-ci-bian-li-by-leetcode/
> 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

官方題解(2)

方法一:中序遍歷
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:        
        def helper(left, right):
            if left > right:
                return None

            # always choose left middle node as a root
            p = (left + right) // 2

            # inorder traversal: left -> node -> right
            root = TreeNode(nums[p])
            root.left = helper(left, p - 1)
            root.right = helper(p + 1, right)
            return root
        
        return helper(0, len(nums) - 1)

> 作者:LeetCode
> 鏈接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/solution/jiang-you-xu-shu-zu-zhuan-huan-wei-er-cha-sou-s-15/
> 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

方法二:還是中序遍歷
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:        
        def helper(left, right):
            if left > right:
                return None
            
            # always choose right middle node as a root
            p = (left + right) // 2 
            if (left + right) % 2:
                p += 1 

            # inorder traversal: left -> node -> right
            root = TreeNode(nums[p])
            root.left = helper(left, p - 1)
            root.right = helper(p + 1, right)
            return root
        
        return helper(0, len(nums) - 1)

> 作者:LeetCode
> 鏈接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/solution/jiang-you-xu-shu-zu-zhuan-huan-wei-er-cha-sou-s-15/
> 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

方法三:依舊是,中序遍歷
from random import randint
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:        
        def helper(left, right):
            if left > right:
                return None
            
            # choose random middle node as a root
            p = (left + right) // 2 
            if (left + right) % 2:
                p += randint(0, 1) 

            # inorder traversal: left -> node -> right
            root = TreeNode(nums[p])
            root.left = helper(left, p - 1)
            root.right = helper(p + 1, right)
            return root
        
        return helper(0, len(nums) - 1)

> 作者:LeetCode
> 鏈接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/solution/jiang-you-xu-shu-zu-zhuan-huan-wei-er-cha-sou-s-15/
> 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

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