在java中实现和可视化二叉树

时间:2014-04-22 17:29:28

标签: java algorithm binary-tree nodes graphviz

我必须实现这个文件中描绘的二叉树

与Diagramm类和二叉树一起进行定位。

enter image description here

enter image description here

所以在文本和图片之后我必须实现一个构造函数,这个二叉树的get和insert方法。

public class BinaryTree {

 private Node root = null;

private static class Node {
    private Integer key;
    private String value;
    private Node left = null;
    private Node right = null;

    public Node(Integer key, String value) {
        this.key = key;
        this.value = value;
    }
}

public boolean insert(Integer key, String value) {
    if (root == null) {
        root = new Node(key, value);
        return true;
    } else {
        return insert(root, key, value);
    }
}

private boolean insert(Node node, Integer key, String value) {
    if (key.equals(node.key)) {
        // duplicate
        return false;
    } else if (key < node.key) {
        if (node.left == null) {
            node.left = new Node(key, value);
            return true;
        } else {
            return insert(node.left, key, value);
        }
    } else if (key > node.key) {
        if (node.right == null) {
            node.right = new Node(key, value);
            return true;
        } else {
            return insert(node.right, key, value);
        }
    }
    return false;
}

// not tested, crass assumptions, public domain
public String get(Integer key) {
    return get(root, key); // start search from the root.
}

public String get(Node node, Integer key) {
    String result = null; // Assume key is not found

    if (node.key.equals(key)) { // Key matches? This is the result.
        return node.value;
    } else {
        if (key < node.key && node.left != null) { // key is lower than
                                                    // current node,
                                                    // and there is a left
                                                    // branch, keep
                                                    // search from there.
            result = get(node.left, key);
        } else if (key > node.key && node.right != null) { // key is greater
                                                            // than current
                                                            // node,
                                                            // and there is
                                                            // a left
                                                            // branch,
                                                            // keep search
                                                            // from there.
                                                            // The key >
                                                            // node.key is
                                                            // arguably
                                                            // redundant.
            result = get(node.right, key);
        }
    }

    return result;
}

如何实现正确的主要功能进行测试?最重要的是,我必须在graphviz的帮助下可视化二叉树,并在节点类中添加一个方法,为点代码创建一个字符串。它如何与日食一起使用?

2 个答案:

答案 0 :(得分:1)

get方法将从树中的特定节点开始,并检查该节点本身是否符合条件。如果是,则返回该值。如果没有,它将推迟到适当的分支并继续搜索。

// not tested, crass assumptions, public domain
public String get(Integer key) {
    return get(root, key); // start search from the root.
}

public String get(Node node, Integer key) {
    String result = null; // Assume key is not found

    if (node.key.equals(key)) { // Key matches? This is the result.
        return node.value;
    } else {
        if (key < node.key && node.left != null) {  // key is lower than current node, 
                                                    // and there is a left branch, keep
                                                    // search from there.
            result = get(node.left, key);
        } else if (key > node.key && node.right != null) {  // key is greater than current node,
                                                            // and there is a left branch,
                                                            // keep search from there.
                                                            // The key > node.key is arguably
                                                            // redundant.
            result = get(node.right, key);
        }
    }

    return result;
}

答案 1 :(得分:0)

如果选择程序方法,正确的做法就是:

public class BinaryTree {
    private Node root = null;

    private static class Node {
        private Integer key;
        private String value;
        private Node left = null;
        private Node right = null;

        public Node(Integer key, String value) {
            this.key = key;
            this.value = value;
        }
    }

    public boolean insert(Integer key, String value) {
        if (root == null) {
            root = new Node(key, value);
            return true;
        } else {
            return insert(root, key, value);
        }
    }

    private boolean insert(Node node, Integer key, String value) {
        if (key.equals(node.key)) {
            // duplicate
            return false;
        } else if (key < node.key) {
            if (node.left == null) {
                node.left = new Node(key, value);
                return true;
            } else {
                return insert(node.left, key, value);
            }
        } else if (key > node.key) {
            if (node.right == null) {
                node.right = new Node(key, value);
                return true;
            } else {
                return insert(node.right, key, value);
            }
        }
        return false;
    }
}

现在将它与OOP方法进行比较并选择,您更喜欢哪一个:

public class BinaryTree {
    private Node root = null;

    private static class Node {
        private Integer key;
        private String value;
        private Node left = null;
        private Node right = null;

        public Node(Integer key, String value) {
            this.key = key;
            this.value = value;
        }

        private boolean insert(Integer key, String value) {
            if (key.equals(this.key)) {
                // duplicate
                return false;
            } else if (key < this.key) {
                if (left == null) {
                    left = new Node(key, value);
                    return true;
                } else {
                    return left.insert(key, value);
                }
            } else if (key > this.key) {
                if (right == null) {
                    right = new Node(key, value);
                    return true;
                } else {
                    return right.insert(key, value);
                }
            }
            return false;
        }
    }

    public boolean insert(Integer key, String value) {
        if (root == null) {
            root = new Node(key, value);
            return true;
        } else {
            return root.insert(key, value);
        }
    }
}

解决方案很简单。对于插入操作:

  1. 如果树中没有root,请创建一个。
  2. 否则为根节点添加新值。
  3. 将值插入某个节点(从根1开始):

    1. 如果节点的键等于插入的键=&gt;我们有一份副本,不会再继续了。
    2. 如果插入的密钥小于节点的密钥,请执行以下操作:
      1. 如果没有左子树,请创建一个新节点并将其指定为左子节点。
      2. 如果已经存在左子树,则以递归方式向其添加新值(键,值)。
    3. 如果插入的密钥大于节点的密钥,请执行:(与#2类比)
相关问题