1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <stdio.h>
#include <stdlib.h>
 
typedef int Element;
 
class Node
{
public:
    int id;
    Element elem;
    Node* left;
    Node* right;
 
    Node() : Node(00, nullptr, nullptr) {};
    Node(int id, Element elem) : Node(id, elem, nullptr, nullptr) {};
    Node(int id, Element elem, Node* left, Node* right) : id(id), elem(elem), left(left), right(right) {}
    virtual ~Node() 
    {
        printf("Node %d Deleted \n", id);
        delete left;
        delete right;
    }
    void preorder()
    {
        printf(" %d", elem);
        if (left) left->preorder();
        if (right) right->preorder();
    }
    void inorder()
    {
        if (left) left->preorder();
        printf(" %d", elem);
        if (right) right->preorder();
    }
    void postorder()
    {
        if (left) left->preorder();
        if (right) right->preorder();
        printf(" %d", elem);
    }
    Node* search_child(int id)
    {
        if (this->id == id)
            return this;
 
        Node* node = nullptr;
        if (left != nullptr)
            node = left->search_child(id);
        if (node == nullptr && right != nullptr)
            node = right->search_child(id);
 
        return node;
    }
};
 
Node* mirror_tree(Node* node)
{
    Node* left = nullptr;
    if (node->right)
        left = mirror_tree(node->right);
 
    Node* r = nullptr;
    if (node->left)
        r = mirror_tree(node->left);
 
    return new Node(node->id, node->elem, left, r);
}
 
int main()
{
    // init tree (bottom-to-top)
    const int NODE_LEN = 6;
    Node* node[NODE_LEN];
    for (int i = 0; i < NODE_LEN; i++)
        node[i] = nullptr;
 
    node[4= new Node(44);
    node[5= new Node(55);
    node[2= new Node(22);
    node[3= new Node(33, node[4], node[5]);
    node[1= new Node(11, node[2], node[3]);
    Node* root = node[1];
 
    // test preorder()
    printf("preorder : ");
    root->preorder();
    printf("\n");
 
    // test preorder() of mirror_tree
    Node* mirror_root = mirror_tree(root);
    printf("preorder : ");
    mirror_root->preorder();
    printf("\n");
 
    // test search_child()
    Node* child = nullptr;
    child = root->search_child(2);
    if (child != nullptr)
        printf("id : %d \n", child->id);
    else
        printf("id : null \n");
 
    child = root->search_child(5);
    if (child != nullptr)
        printf("id : %d \n", child->id);
    else
        printf("id : null \n");
    
    child = root->search_child(6);
    if (child != nullptr)
        printf("id : %d \n", child->id);
    else
        printf("id : null \n");
 
    printf("Delete original tree \n");
    delete root;
    printf("Delete mirror_tree \n");
    delete mirror_root;
    return 0;
}
/*
original tree : 
  1
2   3
   4 5
preorder : 12345

mirror_tree : 
   1
 3   2
5 4
preorder : 13542
*/
 
cs




WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/