-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbitree.cpp
More file actions
70 lines (59 loc) · 1.49 KB
/
Copy pathbitree.cpp
File metadata and controls
70 lines (59 loc) · 1.49 KB
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
#include<iostream>
#include<sstream>
#include<stack>
using namespace std;
template<typename T>
struct BiNode{
T elem; BiNode *lson,*rson;
BiNode(const T &elem): elem(elem),lson(nullptr),rson(nullptr) {}
};
template<typename T>
BiNode<char>* create(T&& in){
char cur;
if(not (in>>cur) or cur=='#'){
return nullptr;
}
BiNode<char>* rt=new BiNode<char>(cur);
rt->lson=create(forward<T>(in));
rt->rson=create(forward<T>(in));
return rt;
}
template<typename T>
void PreOrderTraverse(BiNode<T>* rt){
cout<<(rt->elem)<<" "; // addr 0
if(rt->lson) PreOrderTraverse(rt->lson); // addr 1
if(rt->rson) PreOrderTraverse(rt->rson); // addr 2
}
template<typename T>
void Traverse(BiNode<T>* rt,const char order[]){
cout<<"Traverse(Order: "<<order<<"): ";
stack<pair<BiNode<T>*,int>>s; s.emplace(rt,0);
while(s.size()){
auto [x,i]=s.top(); s.pop();
if(i+1<3) s.emplace(x,i+1);
switch(order[i]){
case 'L':
if(x->lson)
s.emplace(x->lson,0);
break;
case 'R':
if(x->rson)
s.emplace(x->rson,0);
break;
case 'r':
cout<<(x->elem)<<" ";
break;
default:
cerr<<"invaild order!";
exit(-1);
}
}
cout<<endl;
}
int main(){
BiNode<char> *rt=create(istringstream("ABD#G###CE##F##"));
Traverse(rt,"rLR");
Traverse(rt,"LrR");
Traverse(rt,"LRr");
return 0;
}