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

具有父节点的二进制搜索树级顺序

强阳曜
2023-03-14

您好,我正在尝试以(节点元素,父节点元素)的格式打印二进制搜索树的级别顺序。我目前正在使用队列来获取级别顺序,但很难获取父节点。可以处理队列吗?如果是这样的话,我该怎么做呢?如果不是的话,什么是更理想的方法?非常感谢。

例如,使用以下树:

         6
       /   \
      5     7

级别0:(6,空)

一级:(5,6)(7,6)

共有1个答案

宰父衡
2023-03-14

因此,不幸的是,假设节点只有左、右和值,没有一种方法可以严格地使用一个队列来实现这一点。问题是一旦你进入深度

实现这一点的简单方法是在节点类中添加一个节点父节点。除此之外,还可以创建一个内部类来保存节点到父节点的映射,或者可以使用任意数量的数据结构。下面我介绍了如何使用hashmaps实现这一点。

public void printLevelOrder(){
    Queue<Node> q = new LinkedList<Node>();
    Map<Node, Node> parents = new HashMap<Node,Node>();
    Node nextLevel = null;
    q.add(this);
    int lvl = 0;

    while (!q.isEmpty()){
        Node n = q.remove();
        if (n == nextLevel || nextLevel == null){
            System.out.print("\nlvl " + lvl++ +" ");
            nextLevel = null;
        }
        System.out.print("("+n.value +","+parents.remove(n)+")");
        if (n.left != null){
            q.add(n.left);
            parents.put(n.left, n);
            if (nextLevel == null)
                nextLevel = n.left;
        }
        if (n.right != null){
            q.add(n.right);
            parents.put(n.right, n);
            if (nextLevel == null)
                nextLevel = n.right;
        }
    }
}

要按级别打印节点,请执行以下操作。下一个级别是通过添加第一个非null nextLevel节点来确定的。当我们到达那个节点时,我们知道我们在下一行的开头,并再次将其清空。

 类似资料:
  • 我想找到最有效的方法来检查二进制搜索树中最小值的节点。我现在不想用某种编程语言来做,我只想考虑最有效的算法。 对此你怎么看: 我的问题是我应该如何深入挖掘,直到我得到最后一个左节点。我也试着解释这些步骤。你认为那是做这件事的最好方法吗?

  • 我对如何在二叉查找树中排列节点的顺序有点困惑。左边的二叉查找树中的子树节点能比根节点大吗? 例如,以下内容会是二叉搜索树吗? 上面让我困惑的是1(3)的右子树是否可以大于原始根节点(2)。

  • 目前,我在理解如何在没有传递节点时从二进制搜索树中删除节点时遇到了一个问题。我有两个类,BSTSet和BSTNode,每个类都有一个remove方法。。 当我被传递一个节点时,我理解删除方法,但当我在根上调用remove方法并试图从node类中删除节点时,我不知道从何处开始。有人能告诉我吗?谢谢如果您想了解更多信息,请询问。

  • 问题内容: 我们得到了一个需要编写代码的作业: 二叉搜索树 树必须是完整的,而不是完美的(这意味着所有不在最低级别或第二低级别的节点都应有2个子节点,而最低级别的节点应尽可能远) 我们需要按级别顺序插入树中 因此,如果我有一个包含元素{0, 1, 2, 3, 4, 5, 6, 7}的数组,root应该是4,2, 1, 3, 0在左侧和6, 5, 7右侧。 级别订单插入为: 4, 2, 6, 1,

  • 我目前正在做一个学校项目,我必须为二叉搜索树编写一些辅助函数。其中一个函数从树中删除了一个节点。我正在尝试运行一些测试用例,但似乎无法让它们正常工作。我知道这个问题与我如何使用指针有关,但我不太确定我哪里出错了。 这是代码: 注意:我没有包括leftRoot()函数,但它相当简单,我知道它做了它应该做的事情(返回子树中最左边的根)下面是我的教授给我们的测试remove函数的代码部分: 如果有必要,

  • 我正在尝试删除我的二叉查找树的根,以便我可以更新它的值,但这种方法不能做到这一点。我的想法是删除根,然后将其再次插入二叉查找树中,但使用另一个值。它适用于树中的每个节点,但不是我无法删除它的根本原因。有人知道为什么会发生这种情况吗?谢谢。 这是我调用方法删除任何节点的主代码,在这种情况下,我想删除根。