使用sortedset的平衡二叉搜索树

时间:2011-01-20 23:53:53

标签: c# binary-tree binary-search-tree

请帮助我一直在尝试生成大小为1024的随机二叉搜索树,元素需要随机排序...我能够通过手动添加元素来编写代码来手动创建二叉搜索树但我无法编写一个代码,可以生成一个大小为1024的随机平衡二叉树,然后使用try在该树中找到一个密钥......请取悦并感谢你......

编辑从评论中添加代码

你是家庭作业......这就是我所做的代码:

using System; 
namespace bst { 
    public class Node { 
        public int value; 
        public Node Right = null; 
        public Node Left = null; 

        public Node(int value) 
        { 
            this.value = value; 
        } 
    } 

    public class BST { 
        public Node Root = null; 
        public BST() { }

        public void Add(int new_value) 
        { 
            if(Search(new_value)) 
            {
                Console.WriteLine("value (" + new_value + ") already");
            }
            else
            {
                AddNode(this.Root,new_value);
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

使用递归。 每个分支生成一个新分支,选择未分类集中的中间项,中位数。将它放在树中的当前项目中。将小于中位数的所有项复制到另一个数组,将该新数组发送到相同方法的调用。将大于中位数的所有项复制到另一个数组,将该新数组发送到相同方法的调用。\

平衡树必须具有奇数个项,除非未填充主父节点。您需要确定是否存在两个中值,无论重复属于下分支还是上分支。我在示例中将重复项放在上部分支上。

中位数将是等数量小于且大于该数字的数字。 1,2,3,3,4,18,29,105,123 在这种情况下,中位数是4,即使平均值(或平均值)要高得多。

我没有包含确定中位数的代码。

BuildTreeItem(TreeItem Item, Array Set)  
{
  Array Smalls;
  Array Larges;
  Median = DetermineMedian(Set);
  Item.Value = Median;
  if(Set.Count() == 1)
    return;  
  for (int i = 0; int i < Set.Count(); i++)
  {
    if(Set[i] < Median)
    {
      Smalls.new(Set[i]);
    }
    else
    {
      Larges.new(Set[i]);
    }
  }
  Item.Lower = new TreeItem;
  Item.Upper = new TreeItem;
  BuildTreeItem(TreeItem.Lower, Smalls);
  BuildTreeItem(TreeItem.Upper, Larges);
}

答案 1 :(得分:0)

除非是家庭作业,否则最简单的解决方案是首先对数据进行排序,然后通过使用中间项作为根并逐渐下降来构建树。 Xaade提出的方法与类似,但由于确定中位数复杂度而慢得多。

另一种选择是实际查看构建平衡树(例如http://en.wikipedia.org/wiki/Red-black_tree)的算法,看它是否符合您的要求。

编辑:删除关于Xaade算法速度的错误陈述 - 它实际上和快速排序一样快(n log n - 检查递归的每个级别的每个元素与log n级别的递归),不知道为什么我估计它更慢