二叉树算法精要:从基础到实战
二叉树基础结构
二叉树的每个节点包含三个部分:数据域、左子节点指针和右子节点指针。结构定义通常使用如下代码表示:
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
在面向对象语言中可采用类实现:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
核心遍历方法
递归式深度优先遍历
# 前序遍历
def preorder(root):
if not root: return
print(root.val)
preorder(root.left)
preorder(root.right)
# 中序遍历
def inorder(root):
if not root: return
inorder(root.left)
print(root.val)
inorder(root.right)
# 后序遍历
def postorder(root):
if not root: return
postorder(root.left)
postorder(root.right)
print(root.val)
迭代式遍历(使用栈)
def preorder_iter(root):
stack = []
while root or stack:
while root:
print(root.val)
stack.append(root)
root = root.left
root = stack.pop()
root = root.right
层序遍历(BFS)
from collections import deque
def level_order(root):
q = deque([root]) if root else deque()
while q:
node = q.popleft()
print(node.val)
if node.left: q.append(node.left)
if node.right: q.append(node.right)
关键操作接口实现
计算树深度
def max_depth(root):
if not root: return 0
return 1 + max(max_depth(root.left), max_depth(root.right))
镜像对称判断
def is_symmetric(root):
def mirror(left, right):
if not left and not right: return True
if not left or not right: return False
return left.val == right.val and mirror(left.left, right.right) and mirror(left.right, right.left)
return mirror(root.left, root.right) if root else True
OJ 实战技巧
路径总和问题
def has_path_sum(root, target):
if not root: return False
if not root.left and not root.right:
return target == root.val
return has_path_sum(root.left, target - root.val) or has_path_sum(root.right, target - root.val)
最近公共祖先
def lowest_common_ancestor(root, p, q):
if not root or root == p or root == q: return root
left = lowest_common_ancestor(root.left, p, q)
right = lowest_common_ancestor(root.right, p, q)
if left and right: return root
return left if left else right
二叉搜索树验证
def is_valid_bst(root):
def validate(node, min_val, max_val):
if not node: return True
if node.val <= min_val or node.val >= max_val:
return False
return validate(node.left, min_val, node.val) and validate(node.right, node.val, max_val)
return validate(root, float('-inf'), float('inf'))
性能优化要点
递归转迭代可避免栈溢出问题,层序遍历使用双端队列比列表更高效。对于平衡二叉树问题,提前终止条件的设置能显著减少计算量。在路径类问题中,回溯法的剪枝操作可降低时间复杂度。
BbS.okapop103.sbs/PoSt/1122_262794.HtM
BbS.okapop104.sbs/PoSt/1122_587233.HtM
BbS.okapop105.sbs/PoSt/1122_972297.HtM
BbS.okapop106.sbs/PoSt/1122_613028.HtM
BbS.okapop107.sbs/PoSt/1122_619076.HtM
BbS.okapop108.sbs/PoSt/1122_067289.HtM
BbS.okapop109.sbs/PoSt/1122_923645.HtM
BbS.okapop110.sbs/PoSt/1122_983507.HtM
BbS.okapop111.sbs/PoSt/1122_964645.HtM
BbS.okapop112.sbs/PoSt/1122_532333.HtM
BbS.okapop103.sbs/PoSt/1122_933886.HtM
BbS.okapop104.sbs/PoSt/1122_707964.HtM
BbS.okapop105.sbs/PoSt/1122_131687.HtM
BbS.okapop106.sbs/PoSt/1122_607962.HtM
BbS.okapop107.sbs/PoSt/1122_972579.HtM
BbS.okapop108.sbs/PoSt/1122_469495.HtM
BbS.okapop109.sbs/PoSt/1122_193836.HtM
BbS.okapop110.sbs/PoSt/1122_732231.HtM
BbS.okapop111.sbs/PoSt/1122_711679.HtM
BbS.okapop112.sbs/PoSt/1122_619890.HtM
BbS.okapop103.sbs/PoSt/1122_949276.HtM
BbS.okapop104.sbs/PoSt/1122_766216.HtM
BbS.okapop105.sbs/PoSt/1122_860457.HtM
BbS.okapop106.sbs/PoSt/1122_827221.HtM
BbS.okapop107.sbs/PoSt/1122_758645.HtM
BbS.okapop108.sbs/PoSt/1122_148917.HtM
BbS.okapop109.sbs/PoSt/1122_187921.HtM
BbS.okapop110.sbs/PoSt/1122_054487.HtM
BbS.okapop111.sbs/PoSt/1122_123594.HtM
BbS.okapop112.sbs/PoSt/1122_273484.HtM
BbS.okapop103.sbs/PoSt/1122_880994.HtM
BbS.okapop104.sbs/PoSt/1122_880042.HtM
BbS.okapop105.sbs/PoSt/1122_738315.HtM
BbS.okapop106.sbs/PoSt/1122_623072.HtM
BbS.okapop107.sbs/PoSt/1122_266215.HtM
BbS.okapop108.sbs/PoSt/1122_678861.HtM
BbS.okapop109.sbs/PoSt/1122_584584.HtM
BbS.okapop110.sbs/PoSt/1122_500643.HtM
BbS.okapop111.sbs/PoSt/1122_024950.HtM
BbS.okapop112.sbs/PoSt/1122_018362.HtM
BbS.okapop103.sbs/PoSt/1122_767889.HtM
BbS.okapop104.sbs/PoSt/1122_764345.HtM
BbS.okapop105.sbs/PoSt/1122_338234.HtM
BbS.okapop106.sbs/PoSt/1122_835410.HtM
BbS.okapop107.sbs/PoSt/1122_578052.HtM
BbS.okapop108.sbs/PoSt/1122_629923.HtM
BbS.okapop109.sbs/PoSt/1122_008462.HtM
BbS.okapop110.sbs/PoSt/1122_904588.HtM
BbS.okapop111.sbs/PoSt/1122_207357.HtM
BbS.okapop112.sbs/PoSt/1122_429620.HtM
BbS.okapop103.sbs/PoSt/1122_787253.HtM
BbS.okapop104.sbs/PoSt/1122_428632.HtM
BbS.okapop105.sbs/PoSt/1122_076159.HtM
BbS.okapop106.sbs/PoSt/1122_732167.HtM
BbS.okapop107.sbs/PoSt/1122_461573.HtM
BbS.okapop108.sbs/PoSt/1122_792325.HtM
BbS.okapop109.sbs/PoSt/1122_561913.HtM
BbS.okapop110.sbs/PoSt/1122_040158.HtM
BbS.okapop111.sbs/PoSt/1122_768397.HtM
BbS.okapop112.sbs/PoSt/1122_516595.HtM
BbS.okapop113.sbs/PoSt/1122_591258.HtM
BbS.okapop114.sbs/PoSt/1122_183770.HtM
BbS.okapop115.sbs/PoSt/1122_294223.HtM
BbS.okapop116.sbs/PoSt/1122_822160.HtM
BbS.okapop117.sbs/PoSt/1122_889328.HtM
BbS.okapop118.sbs/PoSt/1122_223752.HtM
BbS.okapop119.sbs/PoSt/1122_595115.HtM
BbS.okapop120.sbs/PoSt/1122_159362.HtM
BbS.okapop121.sbs/PoSt/1122_301309.HtM
BbS.okapop122.sbs/PoSt/1122_165107.HtM
BbS.okapop113.sbs/PoSt/1122_867278.HtM
BbS.okapop114.sbs/PoSt/1122_297458.HtM
BbS.okapop115.sbs/PoSt/1122_412805.HtM
BbS.okapop116.sbs/PoSt/1122_487369.HtM
BbS.okapop117.sbs/PoSt/1122_684188.HtM
BbS.okapop118.sbs/PoSt/1122_336015.HtM
BbS.okapop119.sbs/PoSt/1122_103514.HtM
BbS.okapop120.sbs/PoSt/1122_915414.HtM
BbS.okapop121.sbs/PoSt/1122_369040.HtM
BbS.okapop122.sbs/PoSt/1122_320181.HtM
