二叉树
二叉树层数与节点数
二叉树层度从0开始计算,根节点位于第0层。假设当前位于第 l l l层,则每一层至多有 2 l 2^l 2l个节点。一个具有 L L L层的二叉树至多有 1 + 2 + 4 + . . . . . . + 2 L = 2 L + 1 − 1 1+2+4+......+2^L=2^{L+1}-1 1+2+4+......+2L=2L+1−1个节点。一个拥有 N N N个节点的二叉树高度至少为 ⌊ l o g 2 N ⌋ \lfloor log_2N\rfloor ⌊log2N⌋。
二叉树类型
完全二叉树
若设二叉树的深度为 L L L,除第 L L L层外,其它各层的结点数都达到最大,第 L L L层所有的结点都连续集中在最左边。
满二叉树
一棵二叉树的结点要么是叶子结点,要么它有两个子结点。(如果一个二叉树的层数为 L L L,且结点总数是 2 L + 1 − 1 2^{L+1} -1 2L+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))