ABOUT ME

์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์šฉ ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹น~ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋Š” https://velog.io/@ows3090 ์— ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Today
Yesterday
Total
  • [Data Structure] Java ์ด์ง„ํŠธ๋ฆฌ(Binary Tree) ๊ตฌํ˜„
    Data Structure 2021. 1. 17. 21:07
    ๋ฐ˜์‘ํ˜•
    • ์ด ๊ธ€์€ "์˜จ๋ผ์ธ ์ž๋ฐ” ์Šคํ„ฐ๋”” ๋‚ด์šฉ"์„ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

    ์ด์ง„ํŠธ๋ฆฌ(Binary Tree)๋ž€?

    • ํŠธ๋ฆฌ๋ž€ ๋…ธ๋“œ์™€ ๊ฐ„์„ ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ •์˜๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

    • ์ด์ง„ ํŠธ๋ฆฌ๋Š” ํŠธ๋ฆฌ์˜ ์ข…๋ฅ˜ ์ค‘ ํ•˜๋‚˜๋กœ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋‘ ๊ฐœ์˜ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค.

    • ์ด์ง„ ํŠธ๋ฆฌ์˜ ์„œ๋ธŒ ํŠธ๋ฆฌ๋Š” ๊ณต๋ฐฑ์ด ๋  ์ˆ˜๋„ ์žˆ๊ณ  ํ•˜๋‚˜์˜ ์„œ๋ธŒํŠธ๋ฆฌ๋งŒ ๊ฐ€์ง€๊ฑฐ๋‚˜ ๋‘ ๊ฐœ ๋ชจ๋‘ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


    ์ด์ง„ํŠธ๋ฆฌ ๊ตฌํ˜„

    ๋…ธ๋“œ ํด๋ž˜์Šค

    public class Node {
        int value;
        Node left;
        Node right;
    
        public Node(int value) {
            this.value = value;
            left = null;
            right = null;
        }
    }
    

    ๋จผ์ € ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ์ด์ง„ํŠธ๋ฆฌ์— ํ•„์š”ํ•œ ๋…ธ๋“œ๋ฅผ ํด๋ž˜์Šค๋กœ ํ‘œํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ๋…ธ๋“œ ๋‚ด์— ๋‹ด์„ ๋ฐ์ดํ„ฐ์™€ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ, ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.


    ์ด์ง„ํŠธ๋ฆฌ ํด๋ž˜์Šค

    • void push(Node node) : ๋…ธ๋“œ๋ฅผ ํŠธ๋ฆฌ์— ์ถ”๊ฐ€ํ•˜๋Š” ํ•จ์ˆ˜
    • int pop(Node node) : ๋…ธ๋“œ๋ฅผ ํŠธ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•˜๋Š” ํ•จ์ˆ˜
    • boolean contain(Node node) : ๋…ธ๋“œ๊ฐ€ ํŠธ๋ฆฌ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜
    • Node removeLastNode(Node node) : ํŠธ๋ฆฌ์—์„œ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํ•จ์ˆ˜
    • boolean isSame(Node a, Node b) : ๋‘ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๋…ธ๋“œ์ธ์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜
    import java.util.LinkedList;
    import java.util.Queue;
    public class BinaryTree {
    Node head;
    int size;
    public BinaryTree() {
    head = null;
    size = 0;
    }
    public void push(Node nd) {
    if (size == 0) {
    Node node = nd;
    head = node;
    }
    else {
    Node node = head;
    Queue<Node> q = new LinkedList<Node>();
    q.add(node);
    while (!q.isEmpty()) {
    Node temp = q.poll();
    if (temp.left == null) {
    temp.left = nd;
    break;
    }
    else {
    q.add(temp.left);
    }
    if (temp.right == null) {
    temp.right = nd;
    break;
    }
    else {
    q.add(temp.right);
    }
    }
    }
    size++;
    }
    public int pop(Node node) {
    if (contain(node)) {
    Node lastNode = removeLastNode();
    if(head != null){
    if(isSame(head,node)){
    head.value = lastNode.value;
    }
    else{
    Queue<Node> q = new LinkedList<Node>();
    q.add(head);
    while(!q.isEmpty()){
    Node temp = q.poll();
    if(temp.left != null){
    if(isSame(temp.left,node)){
    temp.left.value = lastNode.value;
    break;
    }else{
    q.add(temp.left);
    }
    }
    if(temp.right != null){
    if(isSame(temp.right,node)){
    temp.right.value = lastNode.value;
    break;
    }
    }
    }
    }
    }
    size--;
    return 1;
    }
    return 0;
    }
    public boolean contain(Node node) {
    boolean check = false;
    if (size != 0) {
    Queue<Node> q = new LinkedList<Node>();
    q.add(head);
    while (!q.isEmpty()) {
    Node temp = q.poll();
    if (isSame(temp,node)) {
    check = true;
    break;
    }
    if (temp.left != null) {
    q.add(temp.left);
    }
    if (temp.right != null) {
    q.add(temp.right);
    }
    }
    }
    return check;
    }
    private Node removeLastNode() {
    Node last = head;
    if(size == 1){
    head = null;
    }
    else {
    Queue<Node> q = new LinkedList<Node>();
    q.add(last);
    while (!q.isEmpty()) {
    Node temp = q.poll();
    last = temp;
    if (temp.left != null) {
    q.add(temp.left);
    }
    if (temp.right != null) {
    q.add(temp.right);
    }
    }
    q.add(head);
    while(!q.isEmpty()){
    Node temp = q.poll();
    if(temp.left != null){
    if(isSame(temp.left,last)){
    temp.left = null;
    break;
    }else{
    q.add(temp.left);
    }
    }
    if(temp.right != null){
    if(isSame(temp.right,last)){
    temp.right = null;
    break;
    }else{
    q.add(temp.right);
    }
    }
    }
    }
    return last;
    }
    private boolean isSame(Node a, Node b) {
    if (a.value == b.value && a.left == b.left && a.right == b.right) {
    return true;
    }
    return false;
    }
    public void printBFS(Node node) {
    Queue<Node> queue = new LinkedList<Node>();
    queue.add(node);
    while (!queue.isEmpty()) {
    Node temp = queue.poll();
    System.out.println(temp.value);
    if (temp.left != null) {
    queue.add(temp.left);
    }
    if (temp.right != null) {
    queue.add(temp.right);
    }
    }
    }
    public void printDFS(Node node) {
    if(node.left == null && node.right == null){
    System.out.println(node.value);
    }else{
    if(node.left != null){
    printDFS(node.left);
    }
    System.out.println(node.value);
    if(node.right != null){
    printDFS(node.right);
    }
    }
    }
    }
    view raw Binary Tree.java hosted with โค by GitHub

    BFS (Breadth-First Search)๋ž€?

    • BFS๋Š” ๊ทธ๋ž˜ํ”„ ์ „์ฒด๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜๋กœ ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ๋จผ์ € ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
    • ๋ฃจํŠธ๋…ธ๋“œ๋ถ€ํ„ฐ ๊ฐ€๊นŒ์šด ์ •์ ์„ ๋ฐฉ๋ฌธํ•˜๊ณ  ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š” ๋…ธ๋“œ๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋‚˜์ค‘์— ๋ฐฉ๋ฌธํ•จ์œผ๋กœ์จ ๋…ธ๋“œ๋ฅผ ๋„“๊ฒŒ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
    • BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ ์‹œ ํ(Queue) ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
        public void printBFS(Node node) {
    
            Queue<Node> queue = new LinkedList<Node>();
            queue.add(node);
    
            while (!queue.isEmpty()) {
                Node temp = queue.poll();
                System.out.println(temp.value);
    
                if (temp.left != null) {
                    queue.add(temp.left);
                }
    
                if (temp.right != null) {
                    queue.add(temp.right);
                }
            }
        }

    DFS(Depth-First Search)๋ž€?

    • DFS๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ทธ๋ž˜ํ”„ ์ „์ฒด๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ฃจํŠธ๋…ธ๋“œ์—์„œ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์ „์— ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ๋๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
    • ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ๋๊นŒ์ง€ ๋ฐฉ๋ฌธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ๋“œ๋ฅผ ๊นŠ๊ฒŒ ํƒ์ƒ‰ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ ์‹œ ์žฌ๊ท€ํ•จ์ˆ˜ ๋˜๋Š” ์Šคํƒ์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
        public void printDFS(Node node) {
    
            if(node.left == null && node.right == null){
                System.out.println(node.value);
            }else{
                if(node.left != null){
                    printDFS(node.left);
                }
                System.out.println(node.value);
                if(node.right != null){
                    printDFS(node.right);
                }
            }
        }

    ๊ฒฐ๊ณผ

    public class Main {
        public static void main(String[] args) {
            BinaryTree bt = new BinaryTree();
    
            Node node = new Node(3);
            Node node1 = new Node(5);
            Node node2 = new Node(7);
            Node node3 = new Node(4);
            Node node4 = new Node(2);
    
            bt.push(node);
            bt.push(node1);
            bt.push(node2);
            bt.push(node3);
            bt.push(node4);
    
            System.out.println("BFS๋กœ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค");
            bt.printBFS(node);
    
            System.out.println("\nDFS๋กœ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค");
            bt.printDFS(node);
        }
    }


    ๋ฐ˜์‘ํ˜•
Designed by Tistory.