如何递归地构建最小高度二进制搜索树?

时间:2012-11-02 21:38:02

标签: binary-tree binary-search-tree

我有一个26个整数的数组,1-26依次为[0] = 1 ... a [25] = 26。我一直在使用这段代码,我似乎无法确定为什么我当前的代码不能正常工作。这是我的构建方法:

public static binaryNode buildBalanced(int[] a, int low, int high)
{
    if(low > high)
    {
        return null;
    }
double mid = Math.floor((low + high)/2);
int iMid = (int)mid;
binaryNode node = new binaryNode(a[(int)iMid]);
node.setLeftChild(buildBalanced(a, low, (int)(iMid-1)));
node.setRightChild(buildBalanced(a, (int)(iMid+1), high));
return node;
}

binaryNode是一个具有右子,左子和信息的节点。

现在,当我尝试打印出三个遍历(按顺序,预订和订购后)时,这就是我得到的:

序: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

预购区: 13 1 2 3 4 5 6 7 8 9 10 11 12 14 15 16 17 18 19 20 21 22 23 24 25 26

后序: 1 2 3 4 5 6 7 8 9 10 11 12 14 15 16 17 18 19 20 21 22 23 24 25 26 13

在我看来,此代码无法正常工作。或者是我的in-,, pre-order和post-order方法错了?

以下是我使用的三种打印方法: 序:

public static void printInOrder(binaryNode current, Queue<binaryNode> queue)
{

    if(current == null)
    {
        queue.add(current);
        return;
    }
    if (current.getLeftChild() != null)
    {
        printInOrder(current.getLeftChild(), queue);
    }
    queue.add(current);
    if(current.getRightChild() != null)
    {
        printInOrder(current.getRightChild(), queue);
    }
    if(current.getParent() == null)
    {
        while(!queue.isEmpty())
        {
            System.out.print(queue.remove().getInfo() + " ");               
        }
    }
}

预购区:

public static void printPreOrder(binaryNode current, Queue<binaryNode> queue)
{
     if(current == null)
        {
            queue.add(current);
            return;
        }
        queue.add(current);
        if (current.getLeftChild() != null)
        {
            printInOrder(current.getLeftChild(), queue);
        }
        if(current.getRightChild() != null)
        {
            printInOrder(current.getRightChild(), queue);
        }
        if(current.getParent() == null)
        {
            while(!queue.isEmpty())
            {
                System.out.print(queue.remove().getInfo() + " ");               
            }
        }
}

后序:

public static void printPostOrder(binaryNode current, Queue<binaryNode> queue)
{
    if(current == null)
    {
        queue.add(current);
        return;
    }
    if (current.getLeftChild() != null)
    {
        printInOrder(current.getLeftChild(), queue);
    }
    if(current.getRightChild() != null)
    {
        printInOrder(current.getRightChild(), queue);
    }
    queue.add(current);
    if(current.getParent() == null)
    {
        while(!queue.isEmpty())
        {
            System.out.print(queue.remove().getInfo() + " ");               
        }
    }

}

您可以提供的任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

您的构建步骤看起来很好。但是,您的遍历比它们需要的更复杂。如果要进行迭代遍历而不是使用递归,则只需要一个队列。

由于您正在使用递归,因此遍历不需要队列:

public static void printInOrder(binaryNode current)
{

    if(current == null)
    {
        return;
    }
    printInOrder(current.getLeftChild());
    System.out.print(current.getInfo() + " ");
    printInOrder(current.getRightChild());
}