当前位置: 首页 > 面试题库 >

使用恒定空间和O(n)运行时间编写二叉搜索树的非递归遍历

甘君之
2023-03-14
问题内容

这不是功课,这是一个面试问题。

这里的要点是算法应该是恒定空间。我对没有堆栈的情况一无所知,我会发布我使用堆栈编写的内容,但是无论如何都没有关系。

这是我尝试的方法:我尝试进行预遍历,但到达了最左边的节点,但是我被卡在那里。我不知道如何在没有堆栈/父指针的情况下“递归”备份。

任何帮助,将不胜感激。

(我将其标记为Java,因为这是我很喜欢使用的语言,但是显然它与语言无关。)


问题答案:

我没有完全考虑,但是我认为只要您愿意在此过程中弄乱您的树,这是可能的。

每个节点都有2个指针,因此可以用来表示一个双向链接列表。假设您从Root前进到Root.Left =
Current。现在Root.Left指针已无用,因此将其分配为Current.Right并转到Current.Left。当您到达最左边的孩子时,您将获得一个链接列表,其中树挂在某些节点上。现在,对其进行迭代,对您遇到的每棵树重复该过程

编辑:仔细考虑。这是按顺序打印的html" target="_blank">算法:

void traverse (Node root) {
  traverse (root.left, root);
}

void traverse (Node current, Node parent) {
  while (current != null) {
    if (parent != null) {
      parent.left = current.right;
      current.right = parent;
    }

    if (current.left != null) {
      parent = current;
      current = current.left;
    } else {
      print(current);
      current = current.right;
      parent = null;
    }
  }
}


 类似资料:
  • 给定一个二叉树,我想返回最大和子树的根。 最大子树:树的子树,其所有节点的总和大于任何其他子树的总和。 编辑:节点值为整数。 我可以做以下需要O(n^2)的事情。 计算左子树中所有节点的总和 计算右子树中所有节点的总和 如果左子树和右子树的和以及根的值大于当前最大和,则根存储在结果中 以左子树作为根递归调用此函数 以右子树作为根递归调用此函数。这将需要O(n^2) 我可以将其更改为自底向上的方法,

  • 主要内容:递归实现,非递归实现二叉树中序遍历的实现思想是: 访问当前节点的左子树; 访问根节点; 访问当前节点的右子树; 图 1 二叉树   以图  1 为例,采用中序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1; 遍历节点 1 的左子树,找到节点 2; 遍历节点 2 的左子树,找到节点 4; 由于节点 4 无左孩子,因此找到节点 4,并遍历节点 4 的右子树; 由于节点 4 无右子树,因此节点 2 的左子

  • 问题内容: 我想在非二叉树中搜索一个项目(任何节点都可以有n个孩子)并立即退出递归。所讨论的节点可以是任何节点,而不仅仅是叶子。 这是我的代码,但我没有完整的搜索。 nNode包含: (是孩子) 和数据对象。 问题答案: 探索第一个孩子后,您不应该退出。您不需要循环前面的语句。

  • 我已经知道,如果您尝试查找具有特定键的项目,最坏情况下的运行时间是O(n),。如果您试图搜索特定的数据项(您不知道该键),那么最坏情况下的运行时间是O(n)。然而,如果键和数据都是整数,输入项在插入之前被随机置乱,会怎么样。最糟糕的运行时间还会保持不变吗?

  • 我正在研究一个函数,它在C语言中的二进制搜索树中搜索一个与函数一起传入的名称。但是,我一直在想如何设置循环的格式,这样,当遍历到达最左边的节点时,回退不会简单地结束,而没有子节点。遍历必须是预购的(访问我自己,然后访问我的左孩子,然后访问我的右孩子)。 正如您所看到的,当前,当它到达与传递到函数中的字符串不匹配的最左侧节点时,它只返回NULL。如果它没有在树中找到匹配,我必须让它返回NULL,但同

  • 主要内容:递归实现,非递归实现二叉树后序遍历的实现思想是:从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素。 图 1 二叉树   如图 1 中,对此二叉树进行后序遍历的操作过程为: 从根节点 1 开始,遍历该节点的左子树(以节点 2 为根节点); 遍历节点 2 的左子树(以节点 4 为根节点); 由于节点 4 既没有左子树,也没有右子树,此时访问该节点中的元素 4,并回退到节点 2 ,遍