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

扁平二叉树-->单链表(Ruby)

皇甫敏达
2023-03-14

我正在研究一种递归算法,将二叉树扁平化为单链表。问题陈述:

Given a binary tree, flatten it to a linked list in-place.

For example,
Given

         1
        / \
       2   5
      / \   \
     3   4   6
The flattened tree should look like:
   1
    \
     2
      \
       3
        \
         4
          \
           5
            \
             6

我写了下面的递归代码,它根本不起作用(返回错误的答案),但我不能从概念上理解为什么不起作用。从根开始,我们拉平根。左根和右根。如果root.left存在,那么root.next(在本例中是root.right)将指向扁平化的left列表。然后,左列表指向右列表的开始。这将沿着树递归地继续下去。

这在概念上有问题吗?我尝试在预序遍历之后对它建模,因为基本上是访问根,然后向左,然后向右。

def flatten(root)
    return root if root.nil?
    left_list = flatten(root.left) 
    right_list = flatten(root.right)
    root.left = nil


    root.right = (left_list.nil? ? right_list : left_list)
    find_tail(left_list).right = right_list unless left_list.nil?
end

def find_tail(node)
    return nil if node.nil?
    until node.right.nil?
        node = node.right
    end

    node
end

共有1个答案

桂梓
2023-03-14

您的flatten没有返回它应该返回的内容。当你递归地调用它时,这很重要。将其更改为

    ...
    find_tail(left_list).right = right_list unless left_list.nil?
    root  # <-- add this line
end
 类似资料:
  • 是什么导致了错误? 下面是我的代码:

  • 给定一棵二叉树,将其展平为就地的链表。 例如,给定以下树: 被压扁的树应该是这样的: 我对其他解决方案很感兴趣,但我想问,为什么在运行代码时,输出只与输入树匹配。

  • 我如何转换使用以下代码,我的二叉树到一个简单的链表。这也许可以用递归来完成。 因此,如果根为NULL,也就是,如果函数没有收到有效的指针,则返回错误消息。 如果根是叶,这是,如果左子节点和右子节点都为NULL,您必须将其添加到叶节点列表中。

  • 如果水平顺序遍历优于rest遍历,那么在二叉搜索树中学习它们有什么用呢? 与顺序遍历和前序遍历相比,级别顺序遍历似乎更容易获取信息。

  • 主要内容:二叉排序树转化为平衡二叉树,构建平衡二叉树的代码实现,总结上一节介绍如何使用二叉排序树实现动态 查找表,本节介绍另外一种实现方式—— 平衡二叉树。 平衡二叉树,又称为  AVL 树。实际上就是遵循以下两个特点的二叉树: 每棵子树中的左子树和右子树的深度差不能超过 1; 二叉树中每棵子树都要求是平衡二叉树; 其实就是在二叉树的基础上,若树中每棵子树都满足其左子树和右子树的深度差都不超过 1,则这棵二叉树就是平衡二叉树。 图 1 平衡与不平衡的二叉树及结点的

  • 我正在尝试将二叉查找树展平为单链表。 二进制搜索树: 扁平化单边链表: 我似乎不知道为什么。 我有一个树节点的结构: 我有一个创建和分配内存到树节点的功能: 我有一个列表节点的结构: 我有一个创建列表节点的函数: 我有工作函数来创建二叉搜索树,插入值,等等,但现在我需要创建一个函数来将树展平为列表。 我只是想不出如何将它展平到一个单链表。我见过很多其他的帖子和网站讨论将二叉搜索树转换为双链表或循环