📜  用于中序遍历的二叉树迭代器(1)

📅  最后修改于: 2023-12-03 15:40:53.094000             🧑  作者: Mango

用于中序遍历的二叉树迭代器

二叉树是一种非常常见的数据结构,在程序员的日常工作中经常会用到。二叉树的遍历方式有很多种,其中中序遍历(In-Order Traversal)是一种非常经典的遍历方式,也是二叉搜索树的核心算法之一。

中序遍历的遍历顺序是:先遍历左子树,再遍历根节点,最后遍历右子树。例如,对于下面这棵二叉树:

    3
   / \
  1   5
 / \   \
0   2   6

中序遍历的结果即为:0 -> 1 -> 2 -> 3 -> 5 -> 6

在实际开发中,我们经常需要在二叉树上进行遍历。针对中序遍历这种情况,我们可以使用一种叫做“用于中序遍历的二叉树迭代器”的方法来实现迭代。

实现思路

用于中序遍历的二叉树迭代器的实现思路如下:

  1. 将当前节点的所有左孩子入栈
  2. 弹出栈顶元素(即当前节点),访问该节点
  3. 如果当前节点有右孩子,将该节点的右孩子及右孩子的所有左孩子入栈
  4. 重复 2-3,直到栈为空

栈是用来暂存还未访问的节点的,在实际操作中,常用数组来模拟栈。

代码实现

首先,我们需要定义一个 TreeNode 类来表示二叉树中的节点:

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

接下来,我们定义中序遍历的二叉树迭代器类 InorderIterator。在这个类中,我们需要维护一个栈来暂存还未访问的节点。

import java.util.Stack;

public class InorderIterator {
    Stack<TreeNode> stack;
    
    public InorderIterator(TreeNode root) {
        stack = new Stack<>();
        pushAll(root);
    }

    public boolean hasNext() {
        return !stack.isEmpty();
    }

    public int next() {
        TreeNode node = stack.pop();
        pushAll(node.right);
        return node.val;
    }
    
    private void pushAll(TreeNode node) {
        while (node != null) {
            stack.push(node);
            node = node.left;
        }
    }
}

其中,pushAll 方法用于将当前节点的所有左孩子入栈。next 方法用于弹出栈顶元素并访问该节点。如果该节点有右孩子,则将右孩子及其左孩子全部入栈。hasNext 方法用于判断是否还有元素未访问。

使用方法

下面是使用 InorderIterator 类的示例代码:

    TreeNode root = new TreeNode(3);
    root.left = new TreeNode(1);
    root.left.left = new TreeNode(0);
    root.left.right = new TreeNode(2);
    root.right = new TreeNode(5);
    root.right.right = new TreeNode(6);

    InorderIterator iterator = new InorderIterator(root);
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }

输出结果为:

0
1
2
3
5
6
总结

用于中序遍历的二叉树迭代器是一种非常实用的数据结构,可以让我们在二叉树上进行中序遍历时更加方便。在实际使用中,可以根据需要对该迭代器进行稍微的修改来实现前序遍历或后序遍历。