//13 Queue and Tree BFS With No Recursion
// Key is the function DFS
//2011-06-18
#include <iostream>
using namespace std;
struct node{
int data;
node *left;
node *right;
};
int level_cutoff = 2;
int counter = 0;
/* PART 1 : STACK */
/* See Example 6 Stack */
struct stack_node{
node *data;
struct stack_node *next;
};
// return the new element if succeed, otherwise NULL
stack_node* push(stack_node **stack, node *data){
stack_node *newHead = new stack_node;
if (!newHead) return 0; // memory allocation fails
newHead->data = data;
newHead->next = *stack;
*stack = newHead;
return newHead; // success
}
// return 0 if the stack is empty, otherwise 1
int pop(stack_node **stack, node **data)
{
if (!*stack) return 0;
stack_node *top = *stack;
*data = top->data;
*stack = (*stack)->next;
delete top;
return 1;
}
/* PART 2 : TREE */
node *createNode(){
node *n = new node;
if (!n) return NULL;
n->left = NULL;
n->right = NULL;
//cout << counter <<"\n";
n->data = counter++;
return n;
}
void addChildren(node *n, int level){
if (level >= level_cutoff) return;
node *l = createNode();
if(l) {
n->left = l;
}
node *r = createNode();
if(r) {
n->right = r;
}
addChildren(l, level+1);
addChildren(r, level+1);
}
void printTree(node *n, int level){
if(!n) return;
cout.width(level*4); cout.fill(' ');
cout << n->data << "\n" ;
printTree(n->left, level+1);
printTree(n->right, level+1);
}
void DFS(node *n){
stack_node *stack = new stack_node;
push(&stack, n);
node *cursor;
while(pop(&stack, &cursor)){
if (cursor){
cout << cursor->data << " ";
if(cursor->left) push(&stack, cursor->left);
if(cursor->right) push(&stack, cursor->right);
}
}
}
int main(){
node *root = createNode();
addChildren(root,0);
cout << "\nTree is \n";
printTree(root,0);
cout << "\nDepth first traversal (preorder traversal)\n";
DFS(root);
return 1;
}
Ly8xMyBRdWV1ZSBhbmQgVHJlZSBCRlMgV2l0aCBObyBSZWN1cnNpb24KLy8gICBLZXkgaXMgdGhlIGZ1bmN0aW9uIERGUwovLzIwMTEtMDYtMTgKCiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBub2RlewoJaW50IGRhdGE7Cglub2RlICpsZWZ0OwoJbm9kZSAqcmlnaHQ7IAp9OwoKaW50IGxldmVsX2N1dG9mZiA9IDI7CmludCBjb3VudGVyID0gMDsgCgovKiAgICAgICAgUEFSVCAxIDogU1RBQ0sgICAgICAgICAqLwovKiAgICAgICAgU2VlIEV4YW1wbGUgNiBTdGFjayAgICAqLwpzdHJ1Y3Qgc3RhY2tfbm9kZXsKCW5vZGUgKmRhdGE7CglzdHJ1Y3Qgc3RhY2tfbm9kZSAqbmV4dDsKfTsKCi8vIHJldHVybiB0aGUgbmV3IGVsZW1lbnQgaWYgc3VjY2VlZCwgb3RoZXJ3aXNlIE5VTEwKc3RhY2tfbm9kZSogcHVzaChzdGFja19ub2RlICoqc3RhY2ssIG5vZGUgKmRhdGEpewoJc3RhY2tfbm9kZSAqbmV3SGVhZCA9IG5ldyBzdGFja19ub2RlOwoJaWYgKCFuZXdIZWFkKSByZXR1cm4gMDsgLy8gbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMKCQoJbmV3SGVhZC0+ZGF0YSA9IGRhdGE7CgluZXdIZWFkLT5uZXh0ID0gKnN0YWNrOwoJKnN0YWNrID0gbmV3SGVhZDsKCQoJcmV0dXJuIG5ld0hlYWQ7IC8vIHN1Y2Nlc3MJCn0KCi8vIHJldHVybiAwIGlmIHRoZSBzdGFjayBpcyBlbXB0eSwgb3RoZXJ3aXNlIDEKaW50IHBvcChzdGFja19ub2RlICoqc3RhY2ssIG5vZGUgKipkYXRhKQp7CglpZiAoISpzdGFjaykgcmV0dXJuIDA7CgkKCXN0YWNrX25vZGUgKnRvcCA9ICpzdGFjazsKCSpkYXRhID0gdG9wLT5kYXRhOwoJCgkqc3RhY2sgPSAoKnN0YWNrKS0+bmV4dDsKCWRlbGV0ZSB0b3A7CglyZXR1cm4gMTsKfQoKIAovKiAgICAgICAgUEFSVCAyIDogVFJFRSAgICAgICAgICovCm5vZGUgKmNyZWF0ZU5vZGUoKXsKCW5vZGUgKm4gPSBuZXcgbm9kZTsKCWlmICghbikgcmV0dXJuIE5VTEw7CgluLT5sZWZ0ID0gTlVMTDsKCW4tPnJpZ2h0ID0gTlVMTDsKCQoJLy9jb3V0IDw8IGNvdW50ZXIgPDwiXG4iOwoJbi0+ZGF0YSA9IGNvdW50ZXIrKzsgCglyZXR1cm4gbjsKfQoKdm9pZCBhZGRDaGlsZHJlbihub2RlICpuLCBpbnQgbGV2ZWwpewoJaWYgKGxldmVsID49IGxldmVsX2N1dG9mZikgcmV0dXJuOwoJbm9kZSAqbCA9IGNyZWF0ZU5vZGUoKTsKCWlmKGwpIHsKCQluLT5sZWZ0ID0gbDsKCX0KCW5vZGUgKnIgPSBjcmVhdGVOb2RlKCk7CQoJaWYocikgewoJCW4tPnJpZ2h0ID0gcjsKCX0gCglhZGRDaGlsZHJlbihsLCBsZXZlbCsxKTsKCWFkZENoaWxkcmVuKHIsIGxldmVsKzEpOwp9Cgp2b2lkIHByaW50VHJlZShub2RlICpuLCBpbnQgbGV2ZWwpewoJaWYoIW4pIHJldHVybjsgCgoJY291dC53aWR0aChsZXZlbCo0KTsgY291dC5maWxsKCcgJyk7Cgljb3V0IDw8IG4tPmRhdGEgPDwgIlxuIiA7CglwcmludFRyZWUobi0+bGVmdCwgbGV2ZWwrMSk7IAoJcHJpbnRUcmVlKG4tPnJpZ2h0LCBsZXZlbCsxKTsgCSAKfQoKdm9pZCBERlMobm9kZSAqbil7CglzdGFja19ub2RlICpzdGFjayA9IG5ldyBzdGFja19ub2RlOwoJcHVzaCgmc3RhY2ssIG4pOwoJCglub2RlICpjdXJzb3I7CgkKCXdoaWxlKHBvcCgmc3RhY2ssICZjdXJzb3IpKXsKCQlpZiAoY3Vyc29yKXsJCQoJCQljb3V0IDw8IGN1cnNvci0+ZGF0YSA8PCAiICI7CgkJCWlmKGN1cnNvci0+bGVmdCkgcHVzaCgmc3RhY2ssIGN1cnNvci0+bGVmdCk7CgkJCWlmKGN1cnNvci0+cmlnaHQpIHB1c2goJnN0YWNrLCBjdXJzb3ItPnJpZ2h0KTsJCgkJfQoJfQp9CgppbnQgbWFpbigpewoJbm9kZSAqcm9vdCA9IGNyZWF0ZU5vZGUoKTsKCWFkZENoaWxkcmVuKHJvb3QsMCk7CgkKCWNvdXQgPDwgIlxuVHJlZSBpcyBcbiI7CglwcmludFRyZWUocm9vdCwwKTsKCQoJY291dCA8PCAiXG5EZXB0aCBmaXJzdCB0cmF2ZXJzYWwgKHByZW9yZGVyIHRyYXZlcnNhbClcbiI7CglERlMocm9vdCk7ICAKCQoJcmV0dXJuIDE7Cn0K