二叉树非递归使用常数存储空间遍历

 

主要使用了一个方向值orien,记录在二叉树中搜索时的路径方向,比如由父节点到左子树时orien值为1,这样按照严格的行走规则,在一个while循环里就能遍历整棵树。

    一个简单的例子:

    一棵树为:            8

                  4             12

              2       6     10       14

             1 3     5 7   9  11   13  15

    那么程序将采用一个相当于后序遍历的顺序对树进行遍历,对于一个节点,将先搜索左子树,再搜索右子树,然后输出该节点的值。根据orien值的不同,对遍历的下一步走向进行

    选择,具体看printTree中的while循环。对于上面这棵树,输出顺序为:1 3 2 5 7 6 4 9 11 10 13 15 14 12 8。

    程序没有测试一些特殊情况,可能存在bug,欢迎指正;若有啥问题欢迎交流!

#include <iostream> #include <cstdio> #include <cstring> using namespace std; int orien;//方向值, 1代表当前节点是某个节点的左子树 // 2代表当前节点是某个节点的右子树 // 3代表当前节点有一个左子树,且左子树刚刚被查看过 // 4代表当前节点有一个右子树,且右子树刚刚被查看过 class node{ public: int key; node* parent; node* left; node* right; node(int k=0) { key = k; parent = left = right = NULL; } }; class tree{ public: node* root; tree() { root = NULL; } void insert(node* n)//二叉查找树的插入 { node* y=NULL; node* x = root; while (x != NULL) { y = x; if (n->key < x->key) x = x->left; else x = x->right; } n->parent = y; if (y == NULL) { root = n; } else if (n->key < y->key) { y->left = n; } else { y->right = n; } } }; void buildTree(tree* pt)//建立一棵树 { int ar[]={8,4,12,2,6,10,14,1,3,5,7,9,11,13,15}, i; node* n; for (i=0; i<15; i++) { n = new node(ar[i]); pt->insert(n); } } node* findLeft(node* n)//查找最左节点 { while (n->left!=NULL || n->right!=NULL) { if (n->left==NULL) { n = n->right; orien = 2; } else { n = n->left; orien = 1; } } return n; } void printTree(const tree& t) { node* r = t.root; node* s; if (r == NULL) return; orien = 0; r = findLeft(r); while (r!=NULL || orien!=4) { if (orien == 1) { cout<<r->key<<" "; r = r->parent; orien = 3; } else if (orien == 2) { cout<<r->key<<" "; r = r->parent; orien = 4; } else if (orien == 3) { if (r->right == NULL) { s = r->parent; cout<<r->key<<" "; if (s == NULL){break;} if (r == s->left) orien = 3; else orien = 4; } else { s = r->right; orien = 2; s = findLeft(s); } r = s; } else if (orien == 4) { s = r->parent; cout<<r->key<<" "; if (s==NULL)break; if (s->left == r) orien = 3; else orien = 4; r = s; } } cout<<endl; } int main() { tree t; buildTree(&t); printTree(t); return 0; }  

 

你可能感兴趣的:(测试,tree,null,存储,Class,insert)