Python实现二叉树刷题的常用语法

二叉树层数与节点数

二叉树层度从0开始计算,根节点位于第0层。假设当前位于第 l l 层,则每一层至多有 2 l 2^l 个节点。一个具有 L L 层的二叉树至多有 1 + 2 + 4 + . . . . . . + 2 L = 2 L + 1 1 1+2+4+......+2^L=2^{L+1}-1 个节点。一个拥有 N N 个节点的二叉树高度至少为 l o g 2 N \lfloor log_2N\rfloor

二叉树类型

完全二叉树

若设二叉树的深度为 L L ,除第 L L 层外,其它各层的结点数都达到最大,第 L L 层所有的结点都连续集中在最左边。

满二叉树

一棵二叉树的结点要么是叶子结点,要么它有两个子结点。(如果一个二叉树的层数为 L L ,且结点总数是 2 L + 1 1 2^{L+1} -1 ,则它就是满二叉树。)

二叉搜索树

若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。

特点

对前序遍历排序可以得到中序遍历(Leetcode449)

平衡二叉树

树节点结构

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

前序遍历

迭代

# 迭代法,利用栈的思想,先进先处理
def preorderTraversal(self, root):
        if not root:
            return []
        res = []
        nodes = [root]
        if root:
            while nodes:
                # 处理最右边的
                node = nodes.pop(-1)
                res.append(node.val)
                if node.right:
                    nodes.append(node.right)
                if node.left:
                    nodes.append(node.left)   
        return res

递归

中序遍历

迭代

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]: 
        stack, ret = [], []
        cur = root
        while stack or cur:
            if cur:
                stack.append(cur)
                cur = cur.left
            else:
                cur = stack.pop()
                ret.append(cur.val)
                cur = cur.right

递归

求节点个数

def countNodes(self, root):
	if not node:
    	return 0
	return 1 + dfs(node.left) + dfs(node.right)

求最大深度

def maxDepth(self, root: TreeNode):
	if not root:
    	return 0
	return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right))

已知前序遍历和中序遍历复原二叉树

已知后序遍历和中序遍历复原二叉树

发布了19 篇原创文章 · 获赞 29 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41987033/article/details/104322002