/// <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, }; } } }
/// <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); }
/// <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(); }
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(); }
private void button1_Click(object sender, EventArgs e) { right = treap.Split(Convert.ToInt32(numericUpDown1.Value)); button1.Enabled = false; button3.Enabled = true; }
/// <summary> /// Операция слияния декартового дерева с subTree /// Ключи subTree не меньше, чем ключи текущего дерева /// </summary> /// <param name="subTree">Поддерево, с которым происходит слияние</param> public void Merge(Treap <TNode, TValue> subTree) { Root = NodeOfCartesianTree <TNode, TValue> .Merge(Root, subTree.Root, Logs); }