View difference between Paste ID: Zy7rK0m9 and DSjRtXQr
SHOW: | | - or go back to the newest paste.
1
#ifndef BINARY_TREE
2
#define BINARY_TREE
3
#include "SimpleQueue.h"
4
using namespace std;
5
6
class BinaryTree
7
{
8
    private:
9
        short int state; //0 - empty, 1 - not empty
10
        int rowsCount;
11
        Node *root;
12
        SimpleQueue *nodesToWalk, *tmpNodes;
13
14
        int Power(int n,int power)
15
        {
16
            if (power == 0) return 1;
17
            for (int i=1;i<power;i++)
18
                n *= n;
19
            return n;
20
        }
21
22
    public:
23
        BinaryTree()
24
        {
25
            rowsCount = 0;
26
            state = 0;
27
            root = 0;
28
        }
29
30
        BinaryTree(int v)
31
        {
32
            root = new Node(v);
33
            rowsCount = 1;
34
            state = 1;
35
        }
36
37
        bool init(int v)
38
        {
39
            root = new Node(v);
40
            if (root != 0)
41
            {
42
                state = 1;
43
                rowsCount = 1;
44
                return true;
45
            }
46
            return false;
47
        }
48
49
        void Build(int arr[], int elementsCount)
50
        {
51
            if (state == 0)
52
            {
53
                root = new Node();
54
                state = 1;
55
                rowsCount = 1;
56
            }
57
            if (elementsCount > 0)
58
            {
59
                Node *tmpNode, *tmpChild;
60
                root->SetVal(arr[0]);
61
                nodesToWalk = new SimpleQueue(1);
62
                nodesToWalk->Push(root);
63
                int i=1;
64
                int rowNum = 1;
65
                while (i < elementsCount)
66
                {
67
                    tmpNodes = new SimpleQueue(Power(2,rowNum));
68
                    while (nodesToWalk->GetState() != 3)
69
                    {
70
                        tmpNode = nodesToWalk->Pop();
71
                        if (i < elementsCount)
72
                        {
73
                            tmpNode->SetLeftChild(new Node(arr[i++]));
74
                            tmpChild = tmpNode->GetLeftChild();
75
                            tmpNodes->Push(tmpChild);
76
77
                            if (i < elementsCount)
78
                            {
79
                                tmpNode->SetRightChild(new Node(arr[i++]));
80
                                tmpChild = tmpNode->GetRightChild();
81
                                tmpNodes->Push(tmpChild);
82
                            }
83
                        }
84
                    }
85
                    SimpleQueue *delNodes;
86
                    delNodes = nodesToWalk;
87
                    nodesToWalk = tmpNodes;
88
                    delete delNodes;
89
                    rowNum++;
90
                }
91
                rowsCount = rowNum;
92
            }
93
        }
94
95
        void Walk(int rowNum = 1)
96
        {
97
            Node *tmpNode;
98
            nodesToWalk = new SimpleQueue(1);
99
            nodesToWalk->Push(root);
100
            if (rowNum < 1) rowNum = 1;
101
            else if (rowNum > rowsCount) rowNum = rowsCount;
102
103
            for (int i = 1; i<= rowsCount; i++)
104
            {
105
                tmpNodes = new SimpleQueue(Power(2,i));
106
                while (nodesToWalk->GetState() != 3)
107
                {
108
                    tmpNode = nodesToWalk->Pop();
109
                    if (tmpNode->GetLeftChild() != 0) tmpNodes->Push(tmpNode->GetLeftChild());
110
                    if (tmpNode->GetRightChild() != 0) tmpNodes->Push(tmpNode->GetRightChild());
111
                    if (i >= rowNum) cout << tmpNode->GetVal() << ' ';
112
                }
113
                SimpleQueue * delNodes = nodesToWalk;
114
                nodesToWalk = tmpNodes;
115
                delete delNodes;
116
                cout << endl;
117
            }
118
        }
119
120
        int GetRowsCount() {return rowsCount;}
121
122
        Node * GetRoot() {return root;}
123
};
124
#endif