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

使用广度优先遍历算法,我将项目按连续顺序添加到二叉树中,但它们没有正确添加

倪风史
2023-03-14

我使用以下方法(使用广度优先遍历算法)将项目按连续顺序添加到二叉树中。

例如,如果我有

  A
 / \
 B  C
/  
D 

我希望下一个补充是:

  A
 / \
 B  C
/ \ 
D  E

我的问题在于,我不确定如何正确返回值。我知道当我们遇到第一个空节点时,我们会在其中插入值,但是我们要将它插入到什么中呢?如果我们把它插入到我们从队列中得到的二叉树中,那是根(或我们试图添加到的树)的一个子树,所以返回的不是完整的树。

以下是我的代码:

public static <T> BinaryTree<T> addToTree(BinaryTree<T> t1, BinaryTree<T> t2) {
    Queue<BinaryTree<T>> treeQueue = new LinkedList<BinaryTree<T>>();

    while (t1 != null) {
        if (t1.getLeft() == null) {
            t1.attachLeft(t2);
            break;
        }
        treeQueue.add(t1.getLeft());

        if (t1.getRight() == null) {
            t1.attachRight(t2);
            break;
        }
        treeQueue.add(t1.getRight());

        if (!treeQueue.isEmpty()) t1 = treeQueue.remove();
        else t1 = null;
    }
    return t1;
}

共有2个答案

宋劲
2023-03-14

你的问题是:

如果(!treeQueue.isEmpty())t1=treeQueue。移除();else t1=null;

如果节点没有子节点,可以将其引用设置为null以中断while,但这也是函数返回的值。您只需使用一个临时变量来存储对要返回的节点的引用。

太叔景曜
2023-03-14

好吧,我想我现在明白你的要求了。

您的广度优先实现是正确的。

二叉树是一种“自包含”结构。您从名为A的根开始,有两个对另外两个二叉树的引用,“左”和“右”

你从以下方面开始:

    A
   / \
  B  C
 /  
D 

并添加一棵二叉树E作为B的右子树:

  A
 / \
 B  C
/ \ 
D  E

实际上,您的实现返回一个子树“B”,即新子树的附加位置。我不确定您使用的是什么二进制树实现,但我希望:

"B".attachRight("E");

修改原始树,所以附加节点的“新”树仍然是以“A”开头的树——即您不必返回任何东西!我不知道您的实现是否跟踪“父”,如果是,您可以从“B”开始遍历父级层次结构,直到找到父级为空的节点——根(又是“a”)

调用addToTree(BinaryTree t1, BinaryTree t2)后想要的答案是“t1”,即作为第一个参数传递的“A”根树。

 类似资料:
  • 给定一个数组,构建二叉树,并且按层次打印这个二叉树

  • 本文向大家介绍Java二叉搜索树遍历操作详解【前序、中序、后序、层次、广度优先遍历】,包括了Java二叉搜索树遍历操作详解【前序、中序、后序、层次、广度优先遍历】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java二叉搜索树遍历操作。分享给大家供大家参考,具体如下: 前言:在上一节Java二叉搜索树基础中,我们对树及其相关知识做了了解,对二叉搜索树做了基本的实现,下面我们继续完善我们的

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

  • 本文向大家介绍手写代码:二叉树深度优先遍历相关面试题,主要包含被问及手写代码:二叉树深度优先遍历时的应答技巧和注意事项,需要的朋友参考一下 参考回答: //深度优先搜索 //利用栈,现将右子树压栈再将左子树压栈

  • 中序遍历二叉树 按完全二叉树的层次遍历给出一棵二叉树的遍历序列(其中用0表示虚结点),要求输出该二叉树的深度及中序遍历该二叉树得到的序列。 输入格式: 首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据首先输入一个正整数n(n≤1000),代表给出的二叉树的结点总数(当然,其中可能包含虚结点)。结点编号均为正整数,且各不相同。 然后输入n个正整数,表示按完全二叉树(即第1层1

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