我二传手不设置
问题描述:
所以我想实现BST(二叉搜索树)我做了这增加了树节点到树[树节点]数组我二传手不设置
这里的add方法就是我想要的树节点类设置父节点以及左右节点,我使用调试器进行了检查,但我不确定为什么,但是它没有设置父变量,并且它只在leftChild和rightChild字段中添加一个或另一个。
有问题的二传手是这一个
//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()])"
被称为?任何ide为什么发生这种情况?
答
set方法应该是这样的
//set parent
public void setParent(TreeNode t)
{
this.parent = t;
}
这种方法将使TreeNode
吨由this
引用当前节点的父。
您正在使用的声明将TreeNode t
的父项设置为当前节点的父项。
我会期望'this.parent = t;'而不是'this.parent = t.parent;'...... D'oh? –