返回

二叉树的中序遍历(Inorder Traversal)指南

前端

二叉树的基本概念

二叉树是一种数据结构,它包含一个根节点,并且每个节点最多有两个子节点:左子节点和右子节点。二叉树通常用于表示具有层次关系的数据,例如目录结构、文件系统或决策树。

中序遍历

中序遍历是一种遍历二叉树的算法,它以如下顺序访问每个节点:

  1. 首先访问左子树
  2. 然后访问根节点
  3. 最后访问右子树

中序遍历通常用于以排序顺序访问二叉树中的数据。例如,对于一个二叉搜索树,中序遍历会以从小到大的顺序访问其中的元素。

递归方法

使用递归方法进行中序遍历非常简单。我们只需要按照以下步骤进行:

  1. 首先,检查当前节点是否为null。如果是,则返回。
  2. 否则,递归地遍历左子树。
  3. 然后,访问当前节点。
  4. 最后,递归地遍历右子树。

以下是Java代码示例:

public static void inorderTraversal(TreeNode root) {
  if (root == null) {
    return;
  }

  inorderTraversal(root.left);
  System.out.print(root.val + " ");
  inorderTraversal(root.right);
}

非递归方法

非递归方法也可以用于进行中序遍历。我们需要使用一个栈来存储当前需要访问的节点。具体步骤如下:

  1. 将根节点压入栈中。
  2. 只要栈不为空,就执行以下步骤:
    • 将栈顶节点弹出,并访问它。
    • 如果该节点有左子树,则将左子树压入栈中。
    • 如果该节点有右子树,则将右子树压入栈中。

以下是Java代码示例:

public static void inorderTraversal(TreeNode root) {
  Stack<TreeNode> stack = new Stack<>();
  TreeNode current = root;

  while (!stack.isEmpty() || current != null) {
    while (current != null) {
      stack.push(current);
      current = current.left;
    }

    current = stack.pop();
    System.out.print(current.val + " ");

    current = current.right;
  }
}

时间复杂度和空间复杂度

中序遍历的时间复杂度为O(n),其中n为二叉树中的节点数。这是因为每个节点都会被访问一次。

中序遍历的空间复杂度为O(n)或O(h),其中h为二叉树的高度。这是因为在最坏的情况下,当二叉树退化为一条链时,栈中需要存储所有的节点。

总结

中序遍历是遍历二叉树的一种重要算法,它通常用于以排序顺序访问二叉树中的数据。可以使用递归或非递归方法进行中序遍历,两种方法的时间复杂度和空间复杂度都是O(n)或O(h)。