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

在Java中合并二叉树

公西运良
2023-03-14

我已经在“合并两棵二叉树”上工作了好几个小时了,我不明白为什么我的代码不起作用。树t1被指定为[1,3,2,5],树t2被指定为[2,1,3,null,4,null,7],我必须通过对重叠节点求和并尽可能避免null来合并这两棵树,因此结果应该是[3,4,5,5,4,null,7]。我不是像我应该的那样创建一棵新树,而是重写树t1以获得所需的结果。我的代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
        traversal(t1, t2);
        return t1;
    }

    public void traversal(TreeNode t1, TreeNode t2) {
        if(t2 == null) return;
        if(t1 == null)
            t1 = new TreeNode(0);
        t1.val += t2.val;
        traversal(t1.left, t2.left);
        traversal(t1.right, t2.right);
    }
}

我的代码运行时没有错误,我的最终结果是[3,4,5,5],这显然是错误的。好像是排队

t1 = new TreeNode(0);

不是在做我想让它做的事。我希望它将当前节点从空变为0,左节点为空,右节点为空,这样在下一次迭代中,程序将迭代新创建的空左节点。

我试着在我的IDE中重新创建整个东西(包括类/方法声明),以便使用它并进行一些调试,这样如果需要的话,我可以在本文中编辑我的完整代码,但我也不知道该怎么做

TreeNode(int val, TreeNode left, TreeNode right) {
  this.val = val;
  this.left = left;
  this.right = right;
}

当我希望左边或右边(但不是两者)都为空时,我的完整代码就没有应该的那么干净了。在任何情况下,有人能帮我找出为什么我的代码在给定的输入中得到错误的答案吗?

共有1个答案

陶博涉
2023-03-14

我猜你的问题在于下面的代码并没有真正达到你的目的。

public void traversal(TreeNode t1, TreeNode t2) {
. . .
if(t1 == null)
    t1 = new TreeNode(0);
. . .

在这里,您可以将引用的本地副本更改为指向新对象。您不会更改原始对象。事实上,与最初创建对象的原始方法不同,您不能使用其他方法来实现这一点。请参阅java传递值。

所以基本上您创建了一个新的TreeNode,它没有连接到父节点。您必须手动执行,同时跟踪父节点。

 类似资料:
  • 我正在尝试合并2棵二叉树,而不用担心使结果树平衡。这是我的解决方案,但不起作用。为什么Treenode ans和head从合并函数返回时设置为0。正如我所理解的,由于TreeNode不是原始类型,因此指向ans的head应该在调用合并函数后使用生成的树更新https://leetcode.com/problems/merge-two-binary-trees/

  • 我正在研究合并两个二叉树的问题(https://www.geeksforgeeks.org/merge-two-binary-trees-node-sum/)我很难理解一些递归。为什么要将递归语句设置为和?当你这样做的时候,是否等于两个值? 我只是不确定为什么我们要将递归语句设置为t1.leftt1.right'

  • 我正在尝试用java实现二叉树,下面是我的代码: 我无法在我的树中插入新节点,root的值不会改变 当我调用newnode函数时,我得到了我的Root Node的正确值,但在main函数中,它给了我空点异常 为什么root的值没有更新

  • 问题是: 给定两棵二叉树,想象一下,当您将其中一棵树覆盖另一棵树时,两棵树的一些节点重叠,而其他节点则不重叠。 您需要将它们合并到一个新的二叉树中。合并规则是,如果两个节点重叠,则将节点值加起来作为合并节点的新值。否则,非空节点将用作新树的节点。 注意:合并过程必须从两棵树的根节点开始。 我试图解决这个leetcode问题,但总是得到错误的答案。 我的答案是: 似乎我丢失了节点4和节点7。 然而,

  • 二叉搜索树(BST)和二叉树(BT)中的插入有什么区别?我知道,在BST中,您将新节点的值与根进行比较,如果较小,则添加到其左侧,如果较大,则将其添加到根的右侧。BT的程序是否相同?如果没有,插入和移除的步骤是什么?

  • 我有一个二叉树与7个元素,目前看起来像这样: 我试图按后序遍历它,并在我去的时候重新定义元素,这样它看起来像这样: 使用以下函数,它是我的类: 我的类的其余部分与这里的差不多。我通过在循环中添加数字1-7来填充树。 但是,当我调用,然后打印树时,树是一样的。我猜这与Python传递参数的方式有关(我是一名C程序员),但我不知道如何解决这个问题。我的全部代码都可以在这里找到。