二叉树的后序遍历:递归与迭代实现详解 | 深度优先遍历方法

二叉树的后序遍历(Post-order Traversal)是一种深度优先遍历方法,遍历顺序为:左子树 -> 右子树 -> 根节点。这种遍历方式常用于删除树节点或释放树结构,因为它会先处理子节点再处理父节点。
递归实现
递归实现是最直观的方式,代码简洁易懂:
function postOrderTraversal(root) {
  const result = [];
  
  function traverse(node) {
    if (!node) return;
    
    // 遍历左子树
    traverse(node.left);
    // 遍历右子树
    traverse(node.right);
    // 访问根节点
    result.push(node.val);
  }
  
  traverse(root);
  return result;
}
迭代实现
迭代实现需要借助栈来模拟递归调用栈,代码稍复杂但性能更好:
function postOrderTraversal(root) {
  const result = [];
  const stack = [];
  let prev = null; // 记录上一个访问的节点
  
  while (root || stack.length) {
    // 遍历到最左节点
    while (root) {
      stack.push(root);
      root = root.left;
    }
    
    root = stack.pop();
    
    // 如果右子树为空或已经访问过,则访问当前节点
    if (!root.right || root.right === prev) {
      result.push(root.val);
      prev = root;
      root = null; // 避免重复访问
    } else {
      // 否则重新入栈,继续遍历右子树
      stack.push(root);
      root = root.right;
    }
  }
  
  return result;
}
示例
假设有以下二叉树:
    1
   / \
  2   3
 / \   \
4   5   6
后序遍历结果为:[4, 5, 2, 6, 3, 1]。
应用场景
- 删除二叉树:后序遍历确保子节点先被删除,再删除父节点。
 - 表达式树求值:先计算子表达式,再计算父表达式。
 - 依赖解析:处理依赖关系时,先处理依赖项再处理当前项。
 
如果你有更多问题或需要进一步优化,请随时告诉我!