Пример #1
0
        public NodeP BThat(int data)
        {
            NodeP i = null;

            foreach (NodeP l in TreeTraverse())
            {
                if (l.Data == data)
                {
                    i = l; // Нашли наш элемент.
                }
            }
            if (i == null)
            {
                throw new Exception();
            }
            if (i.Left != null)
            {
                return(new BinTreeWithBackLinks(i.Left).MaxAsNode());
            }
            NodeP y = i.Parent;

            while (y != null)
            {
                if (i == y.Right)
                {
                    return(y);
                }
                i = y;
                y = y.Parent;
            }
            throw new Exception("This is min value");
        }
Пример #2
0
        public override void Add(int data)
        {
            if (Root == null)
            {
                Root = new NodeP(data);
                return;
            }
            NodeP i = Root;

            while (true)
            {
                if (i.Data > data)
                {
                    if (i.Left == null)
                    {
                        i.Left = new NodeP(data, i);
                        return;
                    }
                    i = i.Left;
                }
                else
                {
                    if (i.Right == null)
                    {
                        i.Right = new NodeP(data, i);
                        return;
                    }
                    i = i.Right;
                }
            }
        }
Пример #3
0
        public NodeP MinAsNode()
        {
            NodeP i = Root;

            while (i.Left != null)
            {
                i = i.Left;
            }
            return(i);
        }
Пример #4
0
        private NodeP MaxAsNode()
        {
            NodeP i = Root;

            while (i.Right != null)
            {
                i = i.Right;
            }
            return(i);
        }
Пример #5
0
        public void Delete(int i)
        {
            NodeP a = null;

            foreach (NodeP l in TreeTraverse())
            {
                if (l.Data == i)
                {
                    a = l;
                }
            }
            Delete(a);
        }
Пример #6
0
        public void Prefix_Traverse(ref List <NodeP> trav, NodeP first)
        {
            NodeP i = first;

            if (i != null)
            {
                trav.Add(i);
            }
            if (i == null)
            {
                return;
            }
            Prefix_Traverse(ref trav, i.Left);
            Prefix_Traverse(ref trav, i.Right);
        }
Пример #7
0
        private void Delete(NodeP i)
        {
            NodeP y, x;

            if (i.Left == null || i.Right == null) // если есть дети
            {
                y = i;                             // вырежем эту вершину, если у нее не более одного ребенка
            }
            else
            {
                y = AT(i.Data); // Возвращает элемент, следующий за данным и соотв. не нарушает последовательности
            }
            if (y.Left != null) // если правый или левый потомок есть он попадет в х
            {
                x = y.Left;
            }
            else
            {
                x = y.Right;
            }
            if (x != null) // если один ребенок то он просто замещается
            {
                x.Parent = y.Parent;
            }
            if (y.Parent == null)
            {
                Root = x; // отдельно если корень
            }
            else
            if (y == y.Parent.Left)
            {
                y.Parent.Left = x;
            }
            else
            {
                y.Parent.Right = x;
            }
            if (y != i)
            {
                int temp = i.Data;
                i.Data = y.Data;
                y.Data = temp;
            }
        }
Пример #8
0
 public NodeP(int data, NodeP parent) : this(data) {
     Parent = parent;
 }
Пример #9
0
 public BinTreeWithBackLinks(NodeP i)
 {
     Root = i;
 }