给定一棵二叉树,将其展平为就地的链表。
例如,给定以下树:
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);
}
}
当您重新分配作为参数传递给方法的引用时,它在该方法之外没有任何效果。所以你的上一个作业root=newRoot
不会在
flatte()
方法之外产生任何效果。如果创建另一个节点,则需要更改根
对象的链接。
TreeNode root = new TreeNode(10);
flatten(root);
调用
flatten
root
后,将指向与调用前完全相同的对象。您可以尝试执行以下操作,而不是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,您必须将其添加到叶节点列表中。