zoukankan      html  css  js  c++  java
  • Datawhale编程--二叉树

    二叉树

    二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
    一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点,则此二叉树为完全二叉树。具有n个节点的完全二叉树的深度为floor(log2n)+1。深度为k的完全二叉树,至少有2k-1个叶子节点,至多有2k-1个节点。

    leetcode 98

    代码实现

    这两天考试要考疯了,题目都只是看一遍有个大概思路,遇到难点直接看别人的答案了。

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def inOrder(self, root, output):
            if root is None:
                return
            self.inOrder(root.left, output)
            output.append(root.val)
            self.inOrder(root.right, output)
        
        def isValidBST(self, root):
            """
            :type root: TreeNode
            :rtype: bool
            """
            output = []
            self.inOrder(root, output)
            for i in range(1, len(output)):
                if output[i-1] >= output[i]:
                    return False
            return True
    

    上面是递归做法。事实上,因为树本身的递归定义,很多时候都可以用递归来做,而且思路会很简单。当然,有时候需要考虑内存问题。

    时间复杂度是O(n+log(n)),总觉得这个应该不是最优解法,不过暂时也想不出更好的。

    leetcode 102

    代码实现

    class Solution:
        def levelOrder(self, root):
            if not root: return []
            queue, res = [root], []
            
            while queue:
                cur_level, size = [], len(queue)
                for i in range(size):
                    node = queue.pop(0)
                    if node.left:
                        queue.append(node.left)
                    if node.right:
                        queue.append(node.right)
                    cur_level.append(node.val)
                res.append(cur_level)
            return res
    

    时间空间复杂度都是O(n)。

    leetcode 107

    代码实现

    完全copy。实在是有点反应不过来,复杂度就不分析了。

    class Solution:
        # dfs recursively
        def levelOrderBottom1(self, root):
            res = []
            self.dfs(root, 0, res)
            return res
    
        def dfs(self, root, level, res):
            if root:
                if len(res) < level + 1:
                    res.insert(0, [])
                res[-(level+1)].append(root.val)
                self.dfs(root.left, level+1, res)
                self.dfs(root.right, level+1, res)
    
        # dfs + stack
        def levelOrderBottom2(self, root):
            stack = [(root, 0)]
            res = []
            while stack:
                node, level = stack.pop()
                if node:
                    if len(res) < level+1:
                        res.insert(0, [])
                    res[-(level+1)].append(node.val)
                    stack.append((node.right, level+1))
                    stack.append((node.left, level+1))
            return res
    
        # bfs + queue   
        def levelOrderBottom(self, root):
            queue, res = collections.deque([(root, 0)]), []
            while queue:
                node, level = queue.popleft()
                if node:
                    if len(res) < level+1:
                        res.insert(0, [])
                    res[-(level+1)].append(node.val)
                    queue.append((node.left, level+1))
                    queue.append((node.right, level+1))
            return res
    
  • 相关阅读:
    数组字符串
    return语句
    函数
    js流程控制语句
    js数据类型
    精进:如何成为一个很厉害的人---书摘(转)
    生成随机的数字和字母组合
    modelAndView重定向到外网
    mysql. 替换数据库中某个字段
    java中对于时间的处理
  • 原文地址:https://www.cnblogs.com/ChanWunsam/p/10230344.html
Copyright © 2011-2022 走看看