Пример #1
0
 /// <summary>
 /// Добавляет все узлы декартового дерева в списки
 /// </summary>
 private void AddedAllNodes()
 {
     if (!Treap.IsEmpty())
     {
         Nodes.Add(Treap.Root);
         NodeDrawers.Add(GetNodeDrawer(Treap.Root, Backslash, 0, MaxWidth));
     }
     for (int i = 0; i < Nodes.Count; ++i)
     {
         int mid = (NodeDrawers[i].EndX + NodeDrawers[i].StartX) / 2;
         if (Nodes[i].Left != null)
         {
             Nodes.Add(Nodes[i].Left);
             NodeDrawers.Add(GetNodeDrawer(Nodes[i].Left, NodeDrawers[i].StartY + NodeDrawers[i].Size + DistanseHeight, NodeDrawers[i].StartX, mid));
             NodeDrawers.Last().Arrow =
                 new ArrowDrawer(mid, NodeDrawers[i].StartY + NodeDrawers[i].Size + 2, (NodeDrawers[i].StartX + mid) / 2, NodeDrawers[i].StartY + NodeDrawers[i].Size + DistanseHeight - 2)
             {
                 Pen           = (Pen)PenArrow.Clone(),
                 LengthPointer = NodeDrawers[i].Size / 3,
             };
         }
         if (Nodes[i].Right != null)
         {
             Nodes.Add(Nodes[i].Right);
             NodeDrawers.Add(GetNodeDrawer(Nodes[i].Right, NodeDrawers[i].StartY + NodeDrawers[i].Size + DistanseHeight, mid + 1, NodeDrawers[i].EndX));
             NodeDrawers.Last().Arrow =
                 new ArrowDrawer(mid, NodeDrawers[i].StartY + NodeDrawers[i].Size + 2, (NodeDrawers[i].EndX + mid) / 2, NodeDrawers[i].StartY + NodeDrawers[i].Size + DistanseHeight - 2)
             {
                 Pen           = (Pen)PenArrow.Clone(),
                 LengthPointer = NodeDrawers[i].Size / 3,
             };
         }
     }
 }
Пример #2
0
        /// <summary>
        /// Разделяет текущее декратовое дерева на два по ключу x
        /// Все элементы с ключом не превосходящим х окажутся в левом поддереве
        /// Остальные в правом
        /// </summary>
        /// <param name="x">Ключ, по которому происходит разделение</param>
        /// <param name="left">Левое поддерево</param>
        /// <param name="right">Правое поддерево</param>
        public void Split <T>(T x, out Treap <TNode, TValue> left, out Treap <TNode, TValue> right)
        {
            NodeOfCartesianTree <TNode, TValue> l, r;

            Root.Split(x, out l, out r, Logs);
            left  = new Treap <TNode, TValue>(l);
            right = new Treap <TNode, TValue>(r);
        }
Пример #3
0
 /// <summary>
 /// Конструктор
 /// </summary>
 /// <param name="treap">Декартовое дерево, которое надо нарисовать</param>
 public TreapDrawer(Treap <TNode, TValue> treap, Graphics graphics, int maxWidth, int maxHeight)
 {
     Treap     = treap;
     Graphics  = graphics;
     MaxWidth  = maxWidth;
     MaxHeight = maxHeight;
     AddedAllNodes();
 }
Пример #4
0
 public Form1()
 {
     InitializeComponent();
     NodeOfCartesianTree<NodeWithHeightAndSize, HeightAndSizeInfo>.MinPriority = 0;
     NodeOfCartesianTree<NodeWithHeightAndSize, HeightAndSizeInfo>.MaxPriority = 10009;
     Random rnd = new Random();
     int num = 0;
     do
     {
         num++;
         treap = new Treap<NodeWithHeightAndSize, HeightAndSizeInfo>(true);
         for (int i = 0; i < 25; ++i)
         {
             treap.Add(new HeightAndSizeInfo(rnd. Next(1000)));
         }
     } while (treap.Root.Info.Value.Height > 6);
     treap.Logs?.Clear();
     drawer = new TreapDrawer<NodeWithHeightAndSize, HeightAndSizeInfo>(treap, panel1.CreateGraphics(), panel1.Size.Width, panel1.Size.Height);
     drawer.Logs = treap.Logs;
     drawer.ResetLogs();
 }
Пример #5
0
 private void button1_Click(object sender, EventArgs e)
 {
     right = treap.Split(Convert.ToInt32(numericUpDown1.Value));
     button1.Enabled = false;
     button3.Enabled = true;
 }
Пример #6
0
 /// <summary>
 /// Операция слияния декартового дерева с subTree
 /// Ключи subTree не меньше, чем ключи текущего дерева
 /// </summary>
 /// <param name="subTree">Поддерево, с которым происходит слияние</param>
 public void Merge(Treap <TNode, TValue> subTree)
 {
     Root = NodeOfCartesianTree <TNode, TValue> .Merge(Root, subTree.Root, Logs);
 }