0331 이진트리

2021. 3. 31. 16:14C#/자료구조

Binary Tree

preorder 부모노드를 먼저 순회하고,

다음 왼쪽 서브 트리를,

마지막으로 오른쪽 서브트리를 순회

배열에 이진 트리를 저장하는 방식은 기본적으로 트리 레벨 순으로 왼쪽>오른쪽으로 저장

A[0] = 루트, A[1] = A의 왼쪽 자식, A[2] = A 자식의 오른쪽 형제

public class BinaryTreeArray
    {
        private string[] arr;
        public string Root
        {
            get
            {
                return this.arr[0];
            }
            set 
            {
                this.arr[0] = value;
            }
        }
        public BinaryTreeArray(int capacity) 
        {
            this.arr = new string[capacity];
        }
        public void SetLeft(int parentIndex, string data) 
        {
            int leftIndex = (parentIndex*2) + 1;
            this.arr[leftIndex] = data;
        }
        //왼쪽 요소 가져오기
        public string GetLeft(int parentIndex) 
        {
            int leftIndex = (parentIndex * 2) + 1;
            return this.arr[leftIndex];
        }

        public void SetRight(int parentIndex, string data) 
        {
            int rightIndex = (parentIndex * 2) + 2;
            this.arr[rightIndex] = data;
        }
        //오른쪽 요소 가져오기
        public string GetRight(int parentIndex)
        {
            int rightIndex = (parentIndex * 2) + 2;
            return this.arr[rightIndex];
        }

        //부모 요소 가져오기
        public string GetParent(int childIndex) 
        {
            if (childIndex == 0) return null;
            int parentIndex = (childIndex - 1) / 2;
            return this.arr[parentIndex];
        }

        public void Print() 
        {
            for (int i = 0; i < arr.Length; i++) 
            {
                Console.Write("{0}",this.arr[i] ?? "-");
            }
            Console.WriteLine();
        }
        //?? null이 아닌 경우 왼쪽 피연산자의 값을 반환한다

        
    }
}
public class App
    {
        public App()
        {
            BinaryTreeArray binaryTree = new BinaryTreeArray(7);
            binaryTree.Root = "A";
            binaryTree.SetLeft(0, "B");
            binaryTree.SetRight(0, "C");
            binaryTree.SetLeft(1, "D");
            binaryTree.SetLeft(2, "F");

            binaryTree.Print();
            var parent = binaryTree.GetParent(5);
            Console.WriteLine(parent);
            var left = binaryTree.GetLeft(2);
            Console.WriteLine(left);
        } 

    }

 

 

1. 전위 순회 (Preorder)
ABDEC1. 전위 순회 (Preorder)
ABDECF
2. 중위 순회 (Inorder)
DBEAFC
3. 후위 순회 (Postorder)
DEBFCA

public class BinaryNode
    {
        public BinaryNode left;
        public BinaryNode right;
        public string data;
        public BinaryNode(string data) 
        {
            this.data = data;
        }
    }
public class BinaryTree
    {
        public BinaryNode root;
        public BinaryTree(string data) 
        {
            this.root = new BinaryNode(data);
        }
        public void PreorderTraversal()
        {
            this.PreorderTraversalImpl(this.root);
        }

        public void PreorderTraversalImpl(BinaryNode node)
        {
            if (node == null) return;
            Console.WriteLine("{0}", node.data);
            this.PreorderTraversalImpl(node.left);
            this.PreorderTraversalImpl(node.right);

        }
        //중위 순회
        public void InorderTraversal()
        {
            this.InorderTraversalImpl(this.root);
        }
        public void InorderTraversalImpl(BinaryNode node)
        {
            if (node == null) return;
            this.InorderTraversalImpl(node.left);
            Console.WriteLine("{0}", node.data);
            this.InorderTraversalImpl(node.right);
        }
        //후위순회
        public void PostorederTraversal()
        {
            this.PostorederTraversalImpl(this.root);
        }
        public void PostorederTraversalImpl(BinaryNode node)
        {
            if (node == null) return;
            this.PostorederTraversalImpl(node.left);
            this.PostorederTraversalImpl(node.right);
            Console.WriteLine("{0}", node.data);
        }
    }
public class App
    {
        public App()
        {
            BinaryTree tree = new BinaryTree("A");
            tree.root.left = new BinaryNode("B");
            tree.root.right = new BinaryNode("C");
            tree.root.left.left = new BinaryNode("D");
            tree.root.left.right = new BinaryNode("E");

            Console.WriteLine("전위순회");
            tree.PreorderTraversal();
            Console.WriteLine("중위순회");
            tree.InorderTraversal();
            Console.WriteLine("후위순회");
            tree.PostorederTraversal();
        } 

    }

 

4. Preorder Iterative

public void PreorderIterative() 
        {
            //스택을 만든다.
            var stack = new Stack<BinaryNode>();
            //루트를 넣는다.
            stack.Push(this.root);
            //스택에 요소가 있다면 반복한다.
            while (stack.Count > 0) 
            {
                var node = stack.Pop();
                Console.WriteLine("{0}", node.data);
                //오른쪽에 넣는다.
                if (node.right != null) 
                {
                    stack.Push(node.right);
                }
                //왼쪽에 넣는다.
                if (node.left != null) 
                {
                    stack.Push(node.left);
                }
            }
        }

 

'C# > 자료구조' 카테고리의 다른 글

0401 배열을 사용해 이진트리 구현하기 복습  (0) 2021.04.01
0401 연결트리로 구현한 이진트리 복습  (0) 2021.04.01
0330 Tree 트리  (0) 2021.03.30
0330 Stack  (0) 2021.03.30
0330 Queue  (0) 2021.03.30