当前位置: 首页 > 知识库问答 >
问题:

访谈问:二叉树有序遍历

申屠锦
2023-03-14

我是在一次采访中被问到这个问题的。

问题:给出了一个二叉树和相应子树的高度。然后我们必须按顺序找到一个特定位置的元素

例如:树结构为:D(根节点)[subtree-size=6]-->B,F(D的子节点)[subtree-size=2]-->A,C,E,G(叶节点)[subtree-size=0]。

因此共有3个级别:级别0:D;1级:B级、F级;2级:A、C、E、G

我们必须在inorder中计算特定顺序/位置的节点,例如p。如果p=2,则节点为B(有序遍历)。

我的解决方案:我建议我们需要做一次顺序遍历(通过BFS/DFS),然后我们可以给出第I个顺序节点,时间复杂度将是O(n)。

共有1个答案

蒙麒
2023-03-14

如果我们想在顺序遍历中找到第i个位置的元素:

  • 如果左子树正好有i-1节点,我们知道我们正在查找根。
  • 如果左子树有i或更多节点,我们知道它将在左子树中。
  • 我们知道如果左子树的节点少于i-1,则它将位于右子树中。
  • 我们可以通过适当地更新i来递归地重复这一操作。更具体地说,我们需要将i减小左子树的大小加上右子树的大小,因为该子树的顺序遍历将从原始顺序遍历的那个位置开始。当转到左侧子树时,我们不需要更改i,因为该子树的顺序遍历将从原始顺序遍历的起始位置开始。

所以,在伪代码中,我们可以做到以下几点:

currentNode = root
while true
  if getSubtreeCount(currentNode.left) == i-1
    return currentNode
  else if getSubtreeCount(currentNode.left) < i-1
    currentNode = currentNode.left
  else
    currentNode = currentNode.right
    i -= getSubtreeCount(currentNode.left) + 1

这将为我们提供o(treeHeight)的运行时间。

示例:

假设我们有一棵树:

     D
   /   \
  B     F
 / \   / \
A   C E   G
 类似资料:
  • 为了上课,我必须创建一个状态对象的二叉树,每个状态对象包括一个居民对象的二叉树,这些居民对象组织住在每个州的人。我试图在一个给定的州中搜索最老的居民;然而,居民是按字母顺序组织在树中的,这对我的搜索毫无帮助。因此,我必须遍历整个居民树,更新保存最老的人的节点,并在树被完全遍历后返回它。我已经有了代码的第一部分,但是还停留在如何写递归的剩余部分。 状态树的方法: 然后是公共“包装器”状态树方法:

  • 中序遍历二叉树 按完全二叉树的层次遍历给出一棵二叉树的遍历序列(其中用0表示虚结点),要求输出该二叉树的深度及中序遍历该二叉树得到的序列。 输入格式: 首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据首先输入一个正整数n(n≤1000),代表给出的二叉树的结点总数(当然,其中可能包含虚结点)。结点编号均为正整数,且各不相同。 然后输入n个正整数,表示按完全二叉树(即第1层1

  • 二叉树遍历崩溃求大神帮我分析分析 以下是我同学的代码可以跑 实在是看不出哪里有什么不同

  • 我在编码挑战中遇到了一个问题。 完整二叉树是一种二叉树,其中除叶节点外的每个节点都有两个子节点,且树的最后一级边高度有叶节点。 您的任务很简单,给定完整二叉树的遍历,请按顺序遍历打印其

  • 树的特征和定义 树(Tree)是元素的集合。我们先以比较直观的方式介绍树。下面的数据结构是一个树: 树有多个节点(node),用以储存元素。某些节点之间存在一定的关系,用连线表示,连线称为边(edge)。边的上端节点称为父节点,下端称为子节点。树像是一个不断分叉的树根。 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent)。比如说,3,5是6的子节点,6是3,

  • 这是一个相当简单的问题,我注意到当我表示一棵树时,无论我用哪种方式(后排序,按顺序,前排序)树叶总是以相同的顺序出现,从左到右。 我只是想知道为什么,这是有原因的吗? 我刚开始研究它们,就想到了这个。 编辑: 我有一棵这样的树: 叶节点为:D、E和F 预购顺序为:A、B、D、C、E、F 顺序是:D,B,A,E,C,F 后序是:D,B,E,F,C,A 叶子节点总是从左到右出现,不管我选择哪个顺序,问