所以我正在尝试实现 BST(二叉搜索树),我制作了一个 add 方法,将 TreeNodes 添加到树 [TreeNode] 数组
这是 TreeNode 类,我试图在其中设置父级以及左右节点,我用调试器进行了检查,我不知道为什么,但它没有设置 Parent var,而且也只是设置在 leftChild 和 rightChild 字段中添加其中之一。
有问题的 setter 就是这个
//set parent
public void setParent(TreeNode t)
{
this.parent = t.parent;
}
当我从 PAS43DEPQ 类调用它时,我无法理解它设置不正确。
class TreeNode implements Comparable<TreeNode>
{
private Integer value;
private TreeNode leftChild;
private TreeNode rightChild;
private TreeNode parent;
//constructors
public TreeNode(){}
public TreeNode(Integer v){this.value = v;}
public TreeNode(TreeNode t){
this.value = t.value;
this.parent = t.parent;
this.leftChild = t.leftChild;
this.rightChild = t.rightChild;
}
public TreeNode (Comparable c){this.value = (int) c;}
//set parent
public void setParent(TreeNode t)
{
this.parent = t.parent;
}
//get parent
public TreeNode getParent()
{
return this.parent;
}
//get value
public int getValue(){return value;}
//set value
public void setValue(Integer i){ this.value = i;}
//get left node
public TreeNode getLeftChild(){return leftChild;}
//get right node
public TreeNode getRightChild(){return rightChild;}
//set left child
public void setLeftChild(TreeNode t) {this.leftChild = t;}
//set right child
public void setRightChild(TreeNode t) {this.rightChild = t;}
public TreeNode find(int n)
{
//this statement runs if the current node is == the value being searched.
if(this.value == n)
return this;
//this returns values left of the root then performs a recursive call if not found
if(value < this.value && leftChild != null)
return leftChild.find(n);
//this does the same as above except looks on the right side of the root
if(rightChild != null)
return rightChild.find(n);
//this returns if value is not found
return null;
}
@Override
public int compareTo(TreeNode o)
{
if (this.value == o.value)
{
return 0;// if value equal
}
if (this.value > o.value) //if value greater
{
return 1;
}
if (this.value < o.value)
{
return -1; //if value less
}
return 99;
}
}
这是我添加的类:
public class PAS43DEPQ implements DEPQ
{
private TreeNode[] tree = new TreeNode[100];
int index = 0;
@Override
public Comparable inspectLeast() {
return null;
}
@Override
public Comparable inspectMost() {
return null;
}
/*
right: (2 * n) + 2
left: (2 * n) + 1
parent: (1 - n) / 2
*/
public int right()
{
return (2 * index) + 2;
}
public int left()
{
return (2 * index) + 1;
}
public int parent()
{
return Math.round((index - 1) / 2);
}
@Override
public void add(Comparable c)
{
// Root node
if (tree[0] == null) {
tree[0] = new TreeNode(c);
return;
}
//this while loop is for tree traversal
while(tree[index] != null) {
if( c.compareTo(tree[index].getValue()) == 0) {
index += right() - index;
continue;
}
if( c.compareTo(tree[index].getValue()) > 0) {
index += right() - index;
continue;
}
if( c.compareTo(tree[index].getValue()) < 0) {
index += left() - index;
continue;
}
}
//this part is for place the new node
if(tree[index] == null) {
tree[index] = new TreeNode(c);
tree[index].setParent(tree[parent()]);
if( c.compareTo(tree[index].getValue()) == 0)
tree[parent()].setRightChild(tree[index]);
if( c.compareTo(tree[index].getValue()) > 0)
tree[parent()].setRightChild(tree[index]);
if( c.compareTo(tree[index].getValue()) < 0)
tree[parent()].setLeftChild(tree[index]);
index = 0;
}
return;
}
@Override
public Comparable getLeast() {
return null;
}
@Override
public Comparable getMost() {
return null;
}
@Override
public boolean isEmpty() {
return (tree[0] == null) ? true : false;
}
@Override
public int size() {
return tree.length;
}
}
我无法弄清楚为什么父级没有被设置为该行
“tree[index].setParent(tree[parent()])”
正在被调用吗?关于为什么会发生这种情况有任何想法吗?
最佳答案
set方法应该是这样的
//set parent
public void setParent(TreeNode t)
{
this.parent = t;
}
此方法将使 TreeNode
t 作为 this
引用的当前节点的父节点。
您使用的语句将 TreeNode t
的父节点设置为当前节点的父节点。
关于java - 我的 setter 未设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33595408/