二叉树
二叉树层数与节点数
二叉树层度从0开始计算,根节点位于第0层。假设当前位于第 层,则每一层至多有 个节点。一个具有 层的二叉树至多有 个节点。一个拥有 个节点的二叉树高度至少为 。
二叉树类型
完全二叉树
若设二叉树的深度为 ,除第 层外,其它各层的结点数都达到最大,第 层所有的结点都连续集中在最左边。
满二叉树
一棵二叉树的结点要么是叶子结点,要么它有两个子结点。(如果一个二叉树的层数为 ,且结点总数是 ,则它就是满二叉树。)
二叉搜索树
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。
特点
对前序遍历排序可以得到中序遍历(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))