DataWhale--二叉树

Posted chanwunsam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于DataWhale--二叉树的主要内容,如果未能解决你的问题,请参考以下文章

北邮数据结构考研——平衡二叉树LR型失衡

数据结构 二叉树

数据结构二叉树经典基础习题

数据结构 二叉树的简单理解和代码实现

用c语言写二叉树,源代码。

数据结构中二叉树的顺序存储结构代码怎么编写?