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

一种改进的二叉树的顺序遍历

段溪叠
2023-03-14

这是在一次采访中问我的,但我搞砸了。我们给出了一个二叉树,但是,它被修改了,使得它的子节点永远不为空,如果一个非叶节点没有子节点,那么它的右/左子节点指向该节点本身。对于叶节点,它们指向下一个左节点和右节点。对于最左边和最右边的节点,它将指向自身和前一个/下一个元素

示例:

        1
     /     \
    2       3
  /  \     / \
(4 =  5 = 6 = 7)

这里4.左=4,4.右=5,5.左=4和5.右=6以此类推。

我们需要对这棵树进行顺序遍历。

 if(root.right==root || root.left == root || root.left.right == root || root.right.left == root)

请帮我弄一下。我无法为递归提供适当的条件检查。

我们只需要对这棵树进行顺序遍历。产出:4 2 5 1 6 3 7

共有1个答案

袁康裕
2023-03-14

以下算法应该做到:

visit(vertex v) {
    if (v.left != v && v.left.right != v) visit(v.left)
    print v
    if (v.right != v && v.right.left != v) visit(v.right)
}

我认为你的问题是你试图一次做太多的事情。与其检测顶点是否为叶子,不如先检测它是否有左子节点,然后再检测它是否有右子节点。

 类似资料:
  • 我想对二叉树执行级别顺序遍历。因此,对于给定的树,说: 产出将是: 我知道我可以使用某种队列,但在C中递归地实现这一点的算法是什么?感谢您的帮助。

  • 我尝试按如下方式执行二叉树的垂直顺序遍历:1)找出每个节点与根节点之间的最小和最大水平距离2)创建一个hashmap,将水平距离映射到相应的节点(Map) 然而,我得到了不想要的输出,我认为在实现中有一些错误,因为算法对我来说似乎是正确的。 以下是完整的代码: 输出:{-1=[99999],0=[99999,12],-2=[99999],1=[99999],2=[99999]}那么我的apProc

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

  • 我正在研究爪哇的树木,在我正在研究的书中偶然发现了一些令人困惑的台词。给出的顺序遍历图如下: 遍历(递归)的代码是: 我感到困惑的是: 我已经突出了我所困住的部分。首先,我认为在第三步中,inOrder(C)[而不是inOrder(B)]返回inOrder(A)。第二,访问节点的顺序应该是B->A->C。 请帮帮我吧!

  • 我正在尝试对二叉树进行级别顺序遍历。但诀窍是代替正常的级别顺序遍历,我想做另一种选择。对于例如。 普通等级顺序遍历 : 我要找的是我们打印根。现在,对于每一个偶数级,我都想逆时针旋转,对于每奇数级,都会顺时针旋转: 对于这种遍历,输出应该是: 这是我到目前为止尝试的,但这产生的输出与我试图实现的输出略有不同: 该程序产生以下输出: < code>1 3 2 5 4 7 6 10 11 9 8 我需

  • 我正在学习如何使用Postorder遍历删除二叉树。我知道要删除一个节点,首先我们需要删除它的子节点,然后是节点本身,所以Postorder遍历最适合删除二叉树。我想使用Inorder遍历做同样的事情,一切都很好,但我不明白下面的代码是如何工作的?