作业:Java二进制搜索树。编辑特定节点

时间:2013-03-22 08:42:02

标签: java binary-search-tree

我需要二进制搜索树的帮助。以下是节点和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方法,但我不知道我应该在哪个节点上调用它。

非常感谢任何帮助。

1 个答案:

答案 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.