ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C#AVL 트리
    @ 16. 1 ~ 17. 1/C# 2016. 11. 18. 23:11

    using System;

    using System.Collections;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading;

    using System.Threading.Tasks;

    using System.Collections.Concurrent;


    namespace Console1

    {

        public class AvlNode

        {

            public int m_iData;

            public AvlNode m_Left_Child;

            public AvlNode m_Right_Child;


            public AvlNode(int iData)

            {

                m_iData = iData;

            }

        }


        public class AvlTree

        {

            private AvlNode m_Root;


            //삽입

            public void Avl_Insert(int iKey)

            {

                if(m_Root == null)

                {

                    m_Root = new AvlNode(iKey);

                    return;

                }


                //왼쪽

                if (m_Root.m_iData > iKey)

                {

                    m_Root = NodeInsert(ref m_Root, iKey);

                    

                }

                //오른쪽

                else if(m_Root.m_iData < iKey)

                {


                }

                else

                {

                    Console.WriteLine("중복키");

                }

            }


            private AvlNode NodeInsert(ref AvlNode node, int iKey)

            {

                if(node == null)

                {

                    node = new AvlNode(iKey);

                    return node;

                }


                if (node.m_iData > iKey)

                {

                    node.m_Left_Child = NodeInsert(ref node.m_Left_Child, iKey);

                    BlanceTree(ref node);


                    return node;

                }


                else if(node.m_iData < iKey)

                {

                    node.m_Right_Child = NodeInsert(ref node.m_Right_Child, iKey);


                    BlanceTree(ref node);


                    return node;

                }


                return null;

            }


            private void BlanceTree(ref AvlNode node)

            {

                int iDepthTree = GetHeightTree(node);


                //왼쪽 서브트리 균형

                if(iDepthTree > 1)

                {

                    if(GetHeightTree(node.m_Left_Child) > 0)

                    {

                        //LL 회전

                        AvlNode Root = RotateLL(node);

                        node = Root;

                    }

                    else

                    {


                    }

                }

                //오른쪽 서브트리 균형

                else if(iDepthTree < -1)

                {

                    if (GetHeightTree(node.m_Right_Child) < 0)

                    {


                    }

                    else

                    {


                    }

                }

            }


            //평균인수를 구하는 함수

            private int GetHeightTree(AvlNode node)

            {

                if (node == null)

                    return 0;


                return GetHeight(node.m_Left_Child) - GetHeight(node.m_Right_Child);


            }


            //트리의 높이를 계산

            private int GetHeight(AvlNode node)

            {

                int iHeight = 0;

                if(node != null)

                {

                    iHeight = 1 + Math.Max(GetHeight(node.m_Left_Child), GetHeight(node.m_Right_Child));


                }


                return iHeight;

            }


            private AvlNode RotateLL(AvlNode node)

            {

                AvlNode TempNode = null;

                TempNode = node.m_Left_Child;   //7


                node.m_Left_Child = TempNode.m_Right_Child;         //null


                TempNode.m_Right_Child = node;  //


                return TempNode;

            }

        }




        class Program

        {

            static void Main(string[] args)

            {


                AvlTree pRoot = new AvlTree();

                pRoot.Avl_Insert(10);

                pRoot.Avl_Insert(7);

                pRoot.Avl_Insert(5);


            }

        }

    }


    ** 매개변수의 Ref를 잘써야 한다..이건 C++에서의 이중 포인터와 같다.

    ** 부모 즉, 루트를 바꿔줘야하는게 까다로웠음..뭐 이중포인터를 썼다면 금방 끝날 문제이긴 한데.....

    '@ 16. 1 ~ 17. 1 > C#' 카테고리의 다른 글

    nullable  (0) 2016.11.19
    가비지 컬렉터 가비지 컬렉션  (0) 2016.11.19
    델리게이트, 이벤트 - 1  (0) 2016.11.18
    object 란? boxing unboxing!  (0) 2016.11.18
    참조형식과 값형식 차이, 함수 매개변수(in, out, ref)  (0) 2016.11.18
Designed by Tistory.