Leetcode刷題第三周--樹

Leetcode 98. 驗(yàn)證二叉樹

給定一個(gè)二叉樹,判斷其是否是一個(gè)有效的二叉搜索樹。
假設(shè)一個(gè)二叉搜索樹具有如下特征:
節(jié)點(diǎn)的左子樹只包含小于當(dāng)前節(jié)點(diǎn)的數(shù)。
節(jié)點(diǎn)的右子樹只包含大于當(dāng)前節(jié)點(diǎn)的數(shù)。
所有左子樹和右子樹自身必須也是二叉搜索樹。
示例 1:
輸入:
2
/
1 3
輸出: true

解題思路:自頂向下,確定每個(gè)節(jié)點(diǎn)的取值范圍,然后遞歸。

class Solution(object):
    def isValidBST(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        return self.bfs(root, -float('inf'), float('inf'))
    def bfs(self, root, mini, maxi):
        if root == None:
            return True
        if root.val < mini or root.val > maxi:
            return False
        return self.bfs(root.left, mini, root.val-1) and self.bfs(root.right, root.val+1, maxi)

Leetcode 101. 對(duì)稱二叉樹

給定一個(gè)二叉樹,檢查它是否是鏡像對(duì)稱的。
例如,二叉樹 [1,2,2,3,4,4,3] 是對(duì)稱的。
1
/
2 2
/ \ /
3 4 4 3
但是下面這個(gè) [1,2,2,null,3,null,3] 則不是鏡像對(duì)稱的:
1
/
2 2
\
3 3
說(shuō)明:
如果你可以運(yùn)用遞歸和迭代兩種方法解決這個(gè)問(wèn)題,會(huì)很加分。

解題思路:要判斷兩棵樹是不是對(duì)稱樹,需要:1.根節(jié)點(diǎn)相同,2. 左邊的左子樹和右邊的右子樹相同,3. 左邊的右子樹和右邊的左子樹相同。

圖片.png
class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        if root ==None:
            return True
        return self.dfs(root.left, root.right)

    def dfs(self, p, q):
        if p == None or q ==None:
            return not p and not q
        return p.val == q.val and self.dfs(p.left, q.right) and self.dfs(p.right, q.left)

Leetcode 94. 二叉樹的中序遍歷(迭代法)

給定一個(gè)二叉樹,返回它的中序 遍歷。
示例:
輸入: [1,null,2,3]
1

2
/
3
輸出: [1,3,2]
進(jìn)階: 遞歸算法很簡(jiǎn)單,你可以通過(guò)迭代算法完成嗎?

解題思路:


圖片.png
class Solution(object):
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        res = []
        stack = []
        p = root
        
        while p or len(stack) != 0:
            while p:
                stack.append(p)
                p = p.left
            p = stack[-1]
            stack = stack[:-1]
            res.append(p.val)
            p = p.right
        return res

Leetcode 105. 從前序遍歷和中序遍歷構(gòu)造二叉樹

根據(jù)一棵樹的前序遍歷與中序遍歷構(gòu)造二叉樹。
注意:
你可以假設(shè)樹中沒有重復(fù)的元素。
例如,給出
前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:
3
/
9 20
/
15 7

class Solution(object):
    def buildTree(self, preorder, inorder):
        """
        :type preorder: List[int]
        :type inorder: List[int]
        :rtype: TreeNode
        """
        if len(preorder) == 0:
            return None
        head = TreeNode(preorder[0])
        mid = inorder.index(head.val)
        head.left = self.buildTree(preorder[1 : mid + 1], inorder[0 : mid])
        head.right = self.buildTree(preorder[mid + 1 :], inorder[mid + 1 :])
        return head

Leetcode 102. 二叉樹的層次遍歷

給定一個(gè)二叉樹,返回其按層次遍歷的節(jié)點(diǎn)值。 (即逐層地,從左到右訪問(wèn)所有節(jié)點(diǎn))。
例如:
給定二叉樹: [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回其層次遍歷結(jié)果:
[
[3],
[9,20],
[15,7]
]

class Solution(object):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if not root:
            return None
        queue = [root]
        result = []
        
        while queue:
            temp_list = []
            length = len(queue)
            for i in range(length):
                temp = queue.pop(0)
                temp_list.append(temp.val)
                if temp.left:
                    queue.append(temp.left)
                if temp.right:
                    queue.append(temp.right)
            result.append(temp_list)
        return result

Leetcode 236. 二叉樹的最近公共祖先

class Solution(object):
    def lowestCommonAncestor(self, root, p, q):
        """
        :type root: TreeNode
        :type p: TreeNode
        :type q: TreeNode
        :rtype: TreeNode
        """
        if root == None or p == root or q == root:
            return root
        left = self.lowestCommonAncestor(root.left, p, q)
        right = self.lowestCommonAncestor(root.right, p, q)
        
        if left and right:
            return root
        if not left:
            return right
        if not right:
            return left
        return None
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容