二叉树算法精要:从基础到实战

二叉树基础结构

二叉树的每个节点包含三个部分:数据域、左子节点指针和右子节点指针。结构定义通常使用如下代码表示:

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

#牛客AI配图神器#

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务