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

将二叉树展平到链表

夏昊
2023-03-14

给定一棵二叉树,将其展平为就地的链表。

例如,给定以下树:


    1
   / \
  2   5
 / \   \
3   4   6

被压扁的树应该是这样的:

1
 \
  2
   \
    3
     \
      4
       \
        5
         \
          6

我对其他解决方案很感兴趣,但我想问,为什么在运行代码时,输出只与输入树匹配。

public void flatten(TreeNode root) {
        if(root == null)
            return;
        TreeNode newRoot = new TreeNode(root.val);
        List<TreeNode> list = new ArrayList<>();

        helper(root,list);
        TreeNode current = newRoot;
        for(int i = 1; i < list.size();i++) {
            current.right = new TreeNode(list.get(i).val);
            current = current.right;
        }
        root = newRoot;
    }

    public void helper(TreeNode oldNode,List<TreeNode> list) {
        if(oldNode != null) {
            list.add(oldNode);
            helper(oldNode.left,list);
            helper(oldNode.right,list);
        }
    }

共有1个答案

慕容玉堂
2023-03-14

当您重新分配作为参数传递给方法的引用时,它在该方法之外没有任何效果。所以你的上一个作业root=newRoot 不会在flatte()方法之外产生任何效果。如果创建另一个节点,则需要更改对象的链接。

TreeNode root = new TreeNode(10);
flatten(root);

调用flattenroot后,将指向与调用前完全相同的对象。您可以尝试执行以下操作,而不是root=newRoot

root.right = newRoot.right;
root.left = newRoot.left;

 类似资料:
  • 我正在研究一种递归算法,将二叉树扁平化为单链表。问题陈述: 我写了下面的递归代码,它根本不起作用(返回错误的答案),但我不能从概念上理解为什么不起作用。从根开始,我们拉平根。左根和右根。如果root.left存在,那么root.next(在本例中是root.right)将指向扁平化的left列表。然后,左列表指向右列表的开始。这将沿着树递归地继续下去。 这在概念上有问题吗?我尝试在预序遍历之后对它

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

  • NowCoder 题目描述 平衡二叉树左右子树高度差不超过 1。 解题思路 // java private boolean isBalanced = true; public boolean IsBalanced_Solution(TreeNode root) { height(root); return isBalanced; } private int height(Tre

  • 排序二叉树中存在一个问题就是可能会退化成一个链表,当只有左子树或者右子树有节点的时候,此时排序二叉树就像链表一样,但因为排序二叉树在插入查询的时候还要判断左右子树的问题,这样查询的效率反而变低,从而引出了平衡二叉树 平衡二叉树又称平衡搜索树(Self-balance Binary Search Tree)又称AVL树,同时保证了查询和添加的效率。首先平衡二叉树是一颗排序二叉树,且它是空树或者他的每

  • 是什么导致了错误? 下面是我的代码:

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