【问题标题】:Why is only the root is being added in my LinkedBinaryTree implementation为什么在我的 LinkedBinaryTree 实现中只添加了根
【发布时间】:2018-03-29 02:41:10
【问题描述】:

这是我的代码。 LinkedBinaryTree 和 Position 类来自教科书,如果需要,我可以为这些类提供代码,但我不确定是否有必要。这个类应该能够以这样的方式向二叉树添加一个新节点,对于每个内部节点,存储在父节点左侧的元素小于父节点的元素,并且存储在右侧的元素父节点的大小大于父节点,所以它几乎应该创建一个二叉搜索树。问题是当我打印出结果树时(见下文),我只得到根元素。

import net.datastructures.LinkedBinaryTree;
import net.datastructures.Position;

import java.util.Iterator;

public class IntLinkedBinaryTree extends LinkedBinaryTree<Integer> {


// define instance variables and methods, including a constructor(s) as needed
private Position<Integer> root;
private int size;

/**
 * Creates an empty IntLinkedBinaryTree
 */
public IntLinkedBinaryTree() {
    root = null;
    size = 0;
}

/**
 * Add a new node with e to the tree rooted at position p
 *
 * @param p The root of the tree to which new node is added
 * @param e The element of the new node
 * @return If a node with e does not exist, a new node with e is added and
 * reference to the node is returned. If a node with e exists, null is returned.
 */
public Position<Integer> add(Position<Integer> p, Integer e) {

    if (p == null) {
        root = addRoot(e);
        size++;
        return p;
    }
    Position<Integer> x = p;
    Position<Integer> y = x;
    while (x != null) {
        if (x.getElement().equals(e)) {
            return null;
        } else if (x.getElement() > e) {
            y = x;
            x = left(x);
        } else {
            y = x;
            x = right(x);
        }
    }   // end while
    Position<Integer> temp;
    if (y.getElement() > e) {
        temp = createNode(e, validate(y), null, null);
        addLeft(temp, e);
    } else {
        temp = createNode(e, validate(y), null, null);
        addRight(temp, e);
    }
    size++;
    return temp;
}


public static void main(String[] args) {

    // create a new binary tree instance
    IntLinkedBinaryTree t = new IntLinkedBinaryTree();

    // add some integers
    t.add(t.root, 100);

    t.add(t.root, 50);

    t.add(t.root, 150);

    t.add(t.root, 70);

    // print all integers in the tree in increasing order
    // after adding above four integers, the following should be printed
    // 50 70 100 150

    Iterator<Position<Integer>> it = t.inorder().iterator();
    System.out.println();
    while (it.hasNext()) {
        System.out.print(it.next().getElement() + " ");
    }
    System.out.println();
  }
}

我只得到 100 作为输出,我正要拔掉我的头发。讲师在 LinkedBinaryTree 类中提供了 addRoot()、addLeft() 和 addRight()、inorder() 和 iterator() 方法,整个 main 方法也是如此。当我使用 intelliJ 调试代码时,它调用了 add* 方法,但随后只有 100 次打印到控制台。

【问题讨论】:

  • 用调试器再调查一下,好像每次调用add时,左右节点都重置为null。
  • 如果您不提供所有相关代码,我们很难帮助您调试您的程序。
  • 我知道这一点,但代码量很大,所以我只发布了这门课程,并准备发布其他人要求的内容。

标签: java data-structures binary-tree


【解决方案1】:

我将 addLeft() 和 addRight() 更改为 setLeft() 和 setRight()。它现在可以工作了,但我不知道为什么,因为 addLeft/Right() 在超类中调用 setLeft/Right()...

【讨论】:

    猜你喜欢
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多