You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二叉搜索树:从最底层到根节点的优雅遍历实现方法

嘿,你要的这种遍历其实就是自底向上的层序遍历——从最底层节点开始,每层内保持左到右的顺序,一直遍历到根节点。刚好我可以给你递归和迭代两种实现方案,用Python来举例,思路在其他语言里也通用:

递归实现方案

思路

递归的核心是记录每个节点所在的层级(把根节点算作第0层,子节点层级依次+1),用一个字典来存储每一层对应的节点值列表。递归遍历完成后,我们只需要从最高层级(也就是最底层)到第0层(根节点),把所有层级的节点值依次拼接起来,就能得到想要的结果。

代码示例

首先定义二叉树节点的基础类:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

然后是递归实现的遍历函数:

def bottom_up_traversal_recursive(root):
    # 用字典存储每个层级对应的节点值列表
    level_nodes = {}
    
    def traverse(node, current_level):
        if not node:
            return
        # 如果当前层级还没在字典里,初始化空列表
        if current_level not in level_nodes:
            level_nodes[current_level] = []
        # 将当前节点值加入对应层级的列表
        level_nodes[current_level].append(node.val)
        # 递归遍历左、右子树,层级+1
        traverse(node.left, current_level + 1)
        traverse(node.right, current_level + 1)
    
    # 从根节点(层级0)开始遍历
    traverse(root, 0)
    # 反转层级顺序,拼接所有节点值
    return [val for level in reversed(level_nodes.keys()) for val in level_nodes[level]]
迭代实现方案

思路

迭代的方式可以借助队列实现普通的从上到下层序遍历,把每一层的节点值单独存为一个子列表。遍历完成后,将这些子列表的顺序反转,再展开成一个一维列表,就得到了自底向上的遍历结果。这种方式不需要递归调用栈,适合处理较大的树结构,避免栈溢出问题。

代码示例

from collections import deque

def bottom_up_traversal_iterative(root):
    if not root:
        return []
    
    # 存储每一层的节点值列表
    level_results = []
    # 队列用于层序遍历初始化,先放入根节点
    queue = deque([root])
    
    while queue:
        # 获取当前层的节点数量
        level_size = len(queue)
        current_level = []
        
        for _ in range(level_size):
            node = queue.popleft()
            current_level.append(node.val)
            # 左子节点存在则加入队列
            if node.left:
                queue.append(node.left)
            # 右子节点存在则加入队列
            if node.right:
                queue.append(node.right)
        
        # 将当前层的结果加入列表
        level_results.append(current_level)
    
    # 反转层级顺序,再展开为一维列表
    return [val for level in reversed(level_results) for val in level]
测试示例

按照你给出的示例树结构(根节点A,左子节点B,右子节点C;B的左子节点D、右子节点E;C的右子节点G),我们可以构造树并测试两种实现:

# 构造示例树节点
d_node = TreeNode('D')
e_node = TreeNode('E')
g_node = TreeNode('G')
b_node = TreeNode('B', d_node, e_node)
c_node = TreeNode('C', None, g_node)
a_node = TreeNode('A', b_node, c_node)

# 测试递归实现
print(bottom_up_traversal_recursive(a_node))  # 输出: ['D', 'E', 'G', 'B', 'C', 'A']

# 测试迭代实现
print(bottom_up_traversal_iterative(a_node))  # 输出: ['D', 'E', 'G', 'B', 'C', 'A']

内容的提问来源于stack exchange,提问作者kklaw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:52:29