-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathThreadBiTree.cpp
110 lines (101 loc) · 2.08 KB
/
ThreadBiTree.cpp
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
#include "ThreadBiTree.h"
#include <iostream>
void ThreadBiTree::CopyNode(BiTreeNodePointer origin,ThreadBiTreePointer copier)
{
ThreadBiTreePointer p;
if (origin->lchild != NULL)
{
p = new ThreadBiTreeNode;
copier->lchild = p;
copier->ltag = ThreadBiTree::CHILD;
p->lchild = NULL;
p->rchild = NULL;
p->data = origin->lchild->data;
CopyNode(origin->lchild, p);
}
if (origin->rchild != NULL)
{
p = new ThreadBiTreeNode;
copier->rchild = p;
copier->rtag = ThreadBiTree::CHILD;
p->lchild = NULL;
p->rchild = NULL;
p->data = origin->rchild->data;
CopyNode(origin->rchild, p);
}
}
ThreadBiTree::ThreadBiTree()
{
root = NULL;
}
ThreadBiTree::~ThreadBiTree()
{
}
void ThreadBiTree::CreateFromBiTree(BiTree &t)
{
BiTreeNodePointer troot = t.GetRoot();
if (troot != NULL)
{
root = new ThreadBiTreeNode;
root->data = troot->data;
root->lchild = NULL;
root->rchild = NULL;
CopyNode(troot,root);
}
}
void ThreadBiTree::MakeInThread()
{
if (root != NULL)
{
/*
ThreadBiTreePointer p=root,pre;
while (p->lchild != NULL)
p = p->lchild;
p->lchild = NULL;
p->ltag = THREAD;
pre = p;
InThread(p, pre);
pre->rchild = NULL;
pre->rtag = THREAD;*/
ThreadBiTreePointer pre = NULL;
InThread(root, pre);
pre->rtag = THREAD;
pre->rchild = NULL;
}
}
void ThreadBiTree::InThread(ThreadBiTreePointer p, ThreadBiTreePointer &pre)
{
if (p != NULL)
{
if(p->lchild!=NULL)InThread(p->lchild, pre);
if (p->lchild == NULL)
{
p->lchild = pre;
p->ltag = THREAD;
}
if (pre!=NULL && pre->rchild == NULL)
{
pre->rchild = p;
pre->rtag = THREAD;
}
pre = p;
if (p->rchild != NULL)InThread(p->rchild, pre);
}
}
void ThreadBiTree::ShowInfoPreOrder()
{
ShowNodeInfoPreOrder(root);
}
void ThreadBiTree::ShowNodeInfoPreOrder(ThreadBiTreePointer p)
{
if (p != NULL)
{
std::cout << p << '\t';
std::cout << p->data << '\t' << p->ltag << '\t' << p->lchild << '\t';
std::cout << p->rtag << '\t' << p->rchild << '\t'<<std::endl;
if (p->ltag != THREAD)
ShowNodeInfoPreOrder(p->lchild);
if (p->rtag!= THREAD)
ShowNodeInfoPreOrder(p->rchild);
}
}