用Java显示二进制搜索树

时间:2015-07-12 18:52:08

标签: java binary-search-tree

我在显示二叉搜索树时遇到问题

我希望能够看到插入到树中的每个值,但我不确定错误的位置。还有什么我应该改变,以使这个代码更功能或更容易阅读?

0

这是显示方法:

class BSTNode {
    public int value; // data item (key)
    public BSTNode leftChild; // this node's left child
    public BSTNode rightChild; // this node's right child

    public void displayNode() // display this node
    {
        StringBuilder node = new StringBuilder();
        node.append("{");
        node.append(value);
        node.append("}");
        System.out.println(node);
    }
}

class BSTree {
    private BSTNode root; // first node of tree

    public BSTree() {
        root = null;
    }

    public BSTNode find(int searchValue) // looks for node with certain key
    {
        BSTNode current = root;

        while (current.value != searchValue) {

            if (searchValue < current.value)
                current = current.leftChild;
            else
                current = current.rightChild;

            if (current == null)
                return null;
        }
        return current;
    }

public void insert(int value) // insert a new Node
{
    BSTNode newNode = new BSTNode();
    BSTNode current, parent;

    newNode.value = value;

    if (root == null)
        root = newNode;
    else {
        current = root;
        while (true) {
            parent = current;
            if (value < current.value) // go left
            {
                current = current.leftChild;
                if (current == null) // if end of line
                {
                    parent.leftChild = newNode;
                    return;
                }
            } // end left
            else // go right
            {
                current = current.rightChild;
                if (current == null) // if end of the line
                {
                    parent.leftChild = newNode;
                    return;
                }
            }
        }
    }
}

和主要方法

public void displayBSTree() // display search tree
{
    Stack<BSTNode> treeStack = new Stack<BSTNode>();
    treeStack.push(root);
    int numOfBlanks = 32;
    boolean isRowEmpty = false;
    System.out.println("\n");

    while (isRowEmpty == false) {
        Stack<BSTNode> localStack = new Stack<BSTNode>();
        isRowEmpty = true;

        for (int x = 0; x < numOfBlanks; x++)
            System.out.print(" ");

        while (treeStack.isEmpty() == false) {
            BSTNode temp = (BSTNode)treeStack.pop();
            if (temp != null)
            {
                System.out.print(temp.value);
                localStack.push(temp.leftChild);
                localStack.push(temp.rightChild);

                if (temp.leftChild != null || temp.rightChild != null)
                    isRowEmpty = false;
            }
                else {
                    System.out.print("--");
                    localStack.push(null);
                    localStack.push(null);
                }

                for (int y = 0; y < numOfBlanks*2-2; y++)
                    System.out.print(" ");
            }
        System.out.println();
        numOfBlanks /= 2;
        while (localStack.isEmpty() == false)
            treeStack.push(localStack.pop());

    }
    System.out.println();
}

目前输出

public class ShowBST {

    public static void main(String[] args) {
        int[] values = new int[] {23, 17, 5, 90, 12, 44, 38, 84, 77, 3, 66, 55, 1, 19, 37, 88, 8, 97, 25, 50, 75, 61, 49};

        BSTree tree = new BSTree();

        for (int value : values) {
            tree.insert(value);
        }
        tree.displayBSTree();

    }

}

3 个答案:

答案 0 :(得分:1)

在您使用insert方法遍历树时,您不小心向左走,而不是向右走:

 else // go right
        {
            current = current.rightChild;
            if (current == null) // if end of the line
            {
                parent.leftChild = newNode;
                return;
            }
        }

要修复,请将parent.leftChild的引用更改为parent.rightChild

此外,您可以对代码进行改进。例如,创建一个带有BSTNode类参数的构造函数,这样您就不必每次都设置.value。像这样:

class BSTNode {
    //constructor 
    public BSTNode(int value){
    this.value = value; 
    }
}

然后换到 BSTNode newNode = new BSTNode(value);

答案 1 :(得分:1)

insert中的else条件将节点添加到leftChild而不是rightChild。

        else // go right
        {
            current = current.rightChild;
            if (current == null) // if end of the line
            {
                parent.leftChild = newNode;
                return;
            }
        }

修复完你需要调整间距后,所有空值都会用完空白,所以数字开始合并在一起。

答案 2 :(得分:0)

我猜这是副本&amp;粘贴错误:

            else // go right
            {
                current = current.rightChild;
                if (current == null) // if end of the line
                {
                    parent.leftChild = newNode;
                    return;
                }
            }

应该是:

            else // go right
            {
                current = current.rightChild;
                if (current == null) // if end of the line
                {
                    parent.rightChild = newNode;
                    return;
                }
            }

每次找到适合作为正确节点的东西时,你都会覆盖左侧节点,这就是为什么你只能看到第一个节点添加(23)和最后一个节点(49)应该向右移动但它看起来像在左边。