二叉树理论基础
- 二叉树的主要形式:
1)无数值的二叉树:满二叉树和完全二叉树
2)有数值的二叉树:二叉搜索树和平衡二叉搜索树(AVL树)
- 二叉树的存储方式:
1)链式存储
2)顺序存储–用数组的方式存储二叉树:
设父节点在数组中的下标为i,则左孩子的下标为2i+1,右孩子的下标为2i+2
二叉树遍历方式
- 二叉树的遍历方式:
1)深度优先(先往深处走,遇到叶子节点再往回走)
# 三种遍历存在一个统一的方法实现迭代
#下面以中序遍历为例
#先确认遍历顺序,此时为 左中右
helper=[] #定义辅助栈
results=[] #初始化输出列表
helper=[root] #root为根节点
while helper:
tmp=helper.pop()
if tmp: #按照遍历顺序的反顺序推入栈,注意:中节点后要推入一个空节点到辅助栈中
helper.append(tmp.right)
helper.append(tmp)
helper.append(None) #在中节点后推入空节点到辅助栈中
helper.append(tmp.left)
else:
tmp=helper.pop()
result.append(tmp.val)
return results
前序和中序可以唯一确定一棵二叉树
后序和中序可以唯一确定一棵二叉树
2)广度优先
- 二叉树节点的定义(python版):
class TreeNode:
def __init__(self, value):
self.value=value
self.left=None
self.right=None
解题思路
-
递归三要素:
①确定递归函数的参数和返回值
②确定终止条件
③确定单层逻辑 -
二叉树的深度与高度
二叉树节点高度:从该节点到叶子节点的最长简单路径上的节点个数 (从底向上,后序)
二叉树节点深度:从根节点到该节点的最长简单路径上的节点个数 (从上到下,先序)
- 计算完全二叉树的节点数
分两种情况:
1.完全二叉树为满二叉树:节点数= 2 树 深 度 2^{树深度} 2树深度 -1
2.最后一层叶子节点不满:分别递归左右孩子,递归到某深度一定会有左孩子或有孩子是满二叉树
-
对称二叉树–使用后序遍历思路
解决方案:递归法 fun(left,right) / 迭代法 用辅助队列or辅助栈 -
统计二叉树的所有路径
从上到下遍历路径 --> 前序遍历(递归/迭代)
所有路径 --> 回溯 -
二叉搜索树
注意题目中给定条件:是否有重复值,一般情况下没有重复值(严格大于/小于) -
迭代法中,一般一起操作两个树都是使用队列模拟类似层序遍历,同时处理两个树节点
-
完全二叉树一定是平衡二叉树
-
将二叉搜索树转换为累加树,相当于反中序遍历