ToB企服应用市场:ToB评测及商务社交产业平台

标题: LeetCode 173 二叉搜索树迭代器 [打印本页]

作者: 耶耶耶耶耶    时间: 昨天 10:27
标题: LeetCode 173 二叉搜索树迭代器
LeetCode 173: 二叉搜索树迭代器

题目描述:
实现一个二叉搜索树迭代器 (BSTIterator),基于二叉搜索树(BST)的中序遍历,按升序遍历其节点值。具有以下利用:


题解思绪

中序遍历是 左 -> 根 -> 右 顺序。二叉搜索树特性是左子树的值小于根节点,右子树的值大于根节点。因此中序遍历二叉搜索树会得到一个递增的序列。
本题需要办理的题目:


解法 1:直接存储中序遍历序列

思绪:

模板代码:

  1. class BSTIterator {
  2.     private List<Integer> inOrderList;
  3.     private int index;
  4.     public BSTIterator(TreeNode root) {
  5.         inOrderList = new ArrayList<>();
  6.         index = 0;
  7.         inOrderTraversal(root); // 构造中序遍历序列
  8.     }
  9.     /** 中序遍历,存储到列表中 */
  10.     private void inOrderTraversal(TreeNode root) {
  11.         if (root == null) return;
  12.         inOrderTraversal(root.left);
  13.         inOrderList.add(root.val);
  14.         inOrderTraversal(root.right);
  15.     }
  16.     /** 返回 BST 中的下一个最小值 */
  17.     public int next() {
  18.         return inOrderList.get(index++);
  19.     }
  20.     /** 判断是否还有下一个值 */
  21.     public boolean hasNext() {
  22.         return index < inOrderList.size();
  23.     }
  24. }
复制代码
时间和空间复杂度:



解法 2:迭代 + 栈

思绪:

模板代码:

  1. class BSTIterator {
  2.     private Stack<TreeNode> stack;
  3.     public BSTIterator(TreeNode root) {
  4.         stack = new Stack<>();
  5.         pushLeft(root); // 初始化时沿左子树一路压栈
  6.     }
  7.     /** 将 root 节点的所有左子树节点压入栈 */
  8.     private void pushLeft(TreeNode root) {
  9.         while (root != null) {
  10.             stack.push(root);
  11.             root = root.left;
  12.         }
  13.     }
  14.     /** 返回 BST 中的下一个最小值 */
  15.     public int next() {
  16.         TreeNode node = stack.pop();
  17.         // 如果节点有右子树,对右子树重复压栈操作
  18.         if (node.right != null) {
  19.             pushLeft(node.right);
  20.         }
  21.         return node.val;
  22.     }
  23.     /** 判断是否还有下一个值 */
  24.     public boolean hasNext() {
  25.         return !stack.isEmpty();
  26.     }
  27. }
复制代码
时间和空间复杂度:



解法 3:递归生成器

使用 Java 的递归生成器(基于队列模仿生成器),一次处理一个值。

思绪:

模板代码:

  1. class BSTIterator {
  2.     private Queue<Integer> queue; // 使用队列存储中序遍历结果
  3.     public BSTIterator(TreeNode root) {
  4.         queue = new LinkedList<>();
  5.         inOrderTraversal(root);
  6.     }
  7.     /** 中序遍历,将节点值入队 */
  8.     private void inOrderTraversal(TreeNode root) {
  9.         if (root == null) return;
  10.         inOrderTraversal(root.left);
  11.         queue.offer(root.val);
  12.         inOrderTraversal(root.right);
  13.     }
  14.     /** 返回 BST 中的下一个最小值 */
  15.     public int next() {
  16.         return queue.poll();
  17.     }
  18.     /** 判断是否还有下一个值 */
  19.     public boolean hasNext() {
  20.         return !queue.isEmpty();
  21.     }
  22. }
复制代码
时间和空间复杂度:



快速 AC 的发起



经典变体题目

1. Binary Search Tree Preorder Iterator


  1. class PreorderIterator {
  2.     private Stack<TreeNode> stack;
  3.     public PreorderIterator(TreeNode root) {
  4.         stack = new Stack<>();
  5.         if (root != null) stack.push(root);
  6.     }
  7.     public boolean hasNext() {
  8.         return !stack.isEmpty();
  9.     }
  10.     public int next() {
  11.         TreeNode node = stack.pop();
  12.         if (node.right != null) stack.push(node.right); // 右子树先入栈
  13.         if (node.left != null) stack.push(node.left);   // 左子树后入栈
  14.         return node.val;
  15.     }
  16. }
复制代码

2. Postorder Iterator


  1. class PostorderIterator {
  2.     private Stack<TreeNode> stack1;
  3.     private Stack<TreeNode> stack2;
  4.     public PostorderIterator(TreeNode root) {
  5.         stack1 = new Stack<>();
  6.         stack2 = new Stack<>();
  7.         if (root != null) stack1.push(root);
  8.         while (!stack1.isEmpty()) {
  9.             TreeNode node = stack1.pop();
  10.             stack2.push(node);
  11.             if (node.left != null) stack1.push(node.left);
  12.             if (node.right != null) stack1.push(node.right);
  13.         }
  14.     }
  15.     public boolean hasNext() {
  16.         return !stack2.isEmpty();
  17.     }
  18.     public int next() {
  19.         return stack2.pop().val;
  20.     }
  21. }
复制代码

3. 二叉树层序遍历迭代器


  1. class LevelOrderIterator {
  2.     private Queue<TreeNode> queue;
  3.     public LevelOrderIterator(TreeNode root) {
  4.         queue = new LinkedList<>();
  5.         if (root != null) queue.offer(root);
  6.     }
  7.     public boolean hasNext() {
  8.         return !queue.isEmpty();
  9.     }
  10.     public int next() {
  11.         TreeNode node = queue.poll();
  12.         if (node.left != null) queue.offer(node.left);
  13.         if (node.right != null) queue.offer(node.right);
  14.         return node.val;
  15.     }
  16. }
复制代码

总结


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4