坚持二元搜索实现* Java *

时间:2014-02-15 07:29:46

标签: java binary-search-tree

我正在完成我的任务,我的最后一个问题要求我编写一个使用二进制搜索树字符的程序。 您将从输入中读取一系列字符, 表示二叉搜索树的前序遍历。您需要从中恢复二进制搜索树的原始形状 这个序列并在侧面打印树的内容(如下图所示)并以顺序方式打印出来。

Ipublic class PrintSideways {

public static void main(String[] args) { 

    if(args.length == 0 || args[0].length() == 0)
    {
        throw new IllegalArgumentException ("This is an invalid argument");
    }




    String chars = args[0];

    BinarySearchTree<StringItem, String> bst = new BinarySearchTree<StringItem, String>(); 

这是我收到的骨架代码,我添加了异常行。我不确定如何启动此代码,因为我在binarysearchtrees上很弱。具体来说,我不知道如何在参数中使用StringItem方法。这是提供的StringItem方法。

public class StringItem extends KeyedItem<String> {    

  public StringItem(String str) {    
    super(str);    
  }    
  public String toString(){    
   return getKey()+"";    
}    
}  // end StringItem    

非常感谢一些详细的解释:)谢谢。

1 个答案:

答案 0 :(得分:0)

这是C#中的快速实现,但您仍需要调整它以满足您的结构需求。您仍然应该了解算法,或者如果您遇到问题我可以尝试解释:

    private BinaryTreeNode<int> ReconstructPreorderRecursive(List<int> inorder, List<int> preorder, int inorderStart, int inorderEnd)
    {
        BinaryTreeNode<int> root = new BinaryTreeNode<int>();

        root.Value = preorder[preorderIndex];

        int index = inorder.IndexOf(preorder[preorderIndex]);
        //left subtree
        if (index > inorderStart)
        {
            preorderIndex++;
            root.LeftChild = ReconstructPreorderRecursive(inorder, preorder, inorderStart, index - 1);
            if (root.LeftChild != null)
                root.LeftChild.Parent = root;

        }

        //right subtree
        if (index < inorderEnd)
        {
            preorderIndex++;
            root.RightChild = ReconstructPreorderRecursive(inorder, preorder, index + 1, inorderEnd);
            if (root.RightChild != null)
                root.RightChild.Parent = root;

        }





        return root;
    }

用法:

    newTree.Root = ReconstructPreorderRecursive(lstInorder, lstPreorder, 0, lstInorder.Count - 1);