我需要二进制搜索树的帮助。以下是节点和BST类:
public class Node {
private int key;
private Node parent;
private Node leftChild;
private Node rightChild;
public Node(int key, Node leftChild, Node rightChild) {
this.setKey(key);
this.setLeftChild(leftChild);
this.setRightChild(rightChild);
}
public void setKey(int key) {
this.key = key;
}
public int getKey() {
return key;
}
public void setParent(Node parent) {
this.parent = parent;
}
public Node getParent() {
return parent;
}
public void setLeftChild(Node leftChild) {
this.leftChild = leftChild;
}
public Node getLeftChild() {
return leftChild;
}
public void setRightChild(Node rightChild) {
this.rightChild = rightChild;
}
public Node getRightChild() {
return rightChild;
}
}
public class BinarySearchTree {
private Node root;
public void insert(int key) {
insert(new Node(key, null, null));
}
public void insert(Node z) {
Node y = null;
Node x = root;
while (x != null) {
y = x;
if (z.getKey() < x.getKey()) {
x = x.getLeftChild();
} else {
x = x.getRightChild();
}
}
z.setParent(y);
if (y == null) {
root = z;
} else if (z.getKey() < y.getKey()) {
y.setLeftChild(z);
} else {
y.setRightChild(z);
}
}
public void preorderTraversal() {
preorderTraversal(root);
}
public void preorderTraversal(Node node) {
if (node != null) {
System.out.print(node.getKey() + " ");
preorderTraversal(node.getLeftChild());
preorderTraversal(node.getRightChild());
}
}
public void inorderTraversal() {
inorderTraversal(root);
}
private void inorderTraversal(Node node) {
if (node != null) {
inorderTraversal(node.getLeftChild());
System.out.print(node.getKey() + " ");
inorderTraversal(node.getRightChild());
}
}
public void postorderTraversal() {
postorderTraversal(root);
}
private void postorderTraversal(Node node) {
if (node != null) {
postorderTraversal(node.getLeftChild());
postorderTraversal(node.getRightChild());
System.out.print(node.getKey() + " ");
}
}
}
(摘自http://www.brilliantsheep.com/java-implementation-of-binary-search-tree-insert-and-traversal-methods/)这是一个相对简单的实现。但是,我需要在每个节点中存储额外的信息。节点必须包含候选人和候选人的投票数。关于这个任务有很多抱怨(以及为什么必须使用BST),但请不要进入。
我正在为我的候选人1-20编号,并将其用作二进制搜索树中的键。我的问题是,使用此代码(或略微修改的版本),如何更新给定密钥的特定节点信息?
例如。如果该人投票给候选人4),我该如何更新候选人4的投票信息?
我见过一些find方法,但我不知道我应该在哪个节点上调用它。
非常感谢任何帮助。
答案 0 :(得分:0)
您可以在Node
类中再添加两个属性来存储所需的额外信息。所以Node类看起来会像这样:
public class Node {
private int key;
private Node parent;
private Node leftChild;
private Node rightChild;
public string candidateName;
public int votes;
// .. other properties and methods
}
当您对候选人4进行投票时,遍历您的树以找到带有密钥4的节点,并执行node.votes++
在伪代码中,它看起来像这样:
Node node = root;
while (node.key != 4) {
// implement your tree traversal algorithm here
}
// when you reach here, node is the candidate you were searching
// for, or null if not found
if (node != null) {
node.votes++;
}
确保在Node构造函数中将votes
初始化为0.