【问题标题】:balanced binary search tree using sortedset使用 sortedset 的平衡二叉搜索树
【发布时间】:2011-01-20 23:53:53
【问题描述】:

请帮助我一直在尝试生成大小为 1024 的随机二叉搜索树,并且元素需要是随机排序集...我可以编写代码以手动添加元素来手动创建二叉搜索树但是我无法编写一个代码来生成大小为 1024 的随机平衡二叉树,然后尝试在该树中找到一个密钥...请提前谢谢您...。

编辑添加来自 cmets 的代码

是的,这是家庭作业……这就是我目前得到的代码:

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);
            }
        }
    }
}

【问题讨论】:

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


    【解决方案1】:

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

    平衡树必须有奇数个项目,除非主父节点未填写。您需要确定是否有两个值是中位数,副本属于下分支还是上分支。在我的示例中,我在上面的分支上放置了重复项。

    中位数将是相等数量的数字小于和大于数字的数字。 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);
    }
    

    【讨论】:

    • 所以我所需要的只是添加中位数的代码并生成树。
    【解决方案2】:

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

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

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

    【讨论】:

    • 使用系统;命名空间 bst { 公共类节点 { 公共 int 值;公共节点权利 = null;公共节点左 = null;公共节点(整数值){ this.value = value; } } 公共类 BST { 公共节点根 = null;公共 BST() { }
    • public void Add(int new_value) { if(Search(new_value)) { Console.WriteLine("value (" + new_value + ") already"); } else { AddNode(this.Root,new_value); } }
    • 基本上我完全迷路了,这是一个家庭作业问题,但首先我需要确定如何让这棵树完成我的家庭作业,并开始平均时间和搜索功能,但我如果我得到编码部分的帮助,那就太棒了......
    • 取决于排序的方法。冒泡排序会比我的算法慢。不过快速排序会更快
    • 到目前为止,我找不到比简单地对集合进行排序更快的递归选择中位数的方法。
    猜你喜欢
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多