#include <iostream> #include <vector> #include <stack> using namespace std; struct BtreeNode{ BtreeNode(int value, struct BtreeNode *parent, struct BtreeNode *left, struct BtreeNode *right){ this->value = value; this->parent = parent; this->left = left; this->right = right; } int value; struct BtreeNode *parent; struct BtreeNode *left; struct BtreeNode *right; }; void insertNode(struct BtreeNode **root, int value){ if(NULL == *root){ struct BtreeNode *tmp = new struct BtreeNode(value, NULL, NULL, NULL); tmp->value = value; *root = tmp; }else{ struct BtreeNode *tmp = *root; while(tmp){ if(tmp->value < value){ if(tmp->right == NULL){ struct BtreeNode *tmp1 = new struct BtreeNode(value, NULL, NULL, NULL); tmp1->value = value; tmp1->parent = tmp; tmp->right = tmp1; return ; } tmp = tmp->right; }else if(tmp->value > value){ if(NULL == tmp->left){ struct BtreeNode *tmp1 = new struct BtreeNode(value, NULL, NULL, NULL); tmp1->value = value; tmp1->parent = tmp; tmp->left = tmp1; return ; } tmp = tmp->left; }else{ return ; } } } } void preTraverse(struct BtreeNode *root){ if(root == NULL) return ; cout<<root->value<<" "; preTraverse(root->left); preTraverse(root->right); } void preTraverseWithoutRecursion(struct BtreeNode *root){ if(NULL == root){ return; } stack<struct BtreeNode *> record; cout<<root->value<<" "; if(root->right != NULL) record.push(root->right); if(root->left != NULL) record.push(root->left); while(!record.empty()){ struct BtreeNode * tmp = record.top(); record.pop(); cout<<tmp->value<<" "; //先右后左 if(tmp->right != NULL) record.push(tmp->right); if(tmp->left != NULL) record.push(tmp->left); } } void inTraverse(struct BtreeNode *root){ if(root == NULL) return ; inTraverse(root->left); cout<<root->value<<" "; inTraverse(root->right); } void inTraverseWithoutRecursion(struct BtreeNode *root){ if(NULL == root){ return; } stack<struct BtreeNode *> record; //一直压到最左边的子节点 struct BtreeNode *tmp = root; while(tmp != NULL){ record.push(tmp); tmp = tmp->left; } while(!record.empty()){ tmp = record.top(); record.pop(); cout<<tmp->value<<" "; tmp = tmp->right; while(tmp != NULL){ record.push(tmp); tmp = tmp->left; } } } void AfterTraverse(struct BtreeNode *root){ if(root == NULL) return ; AfterTraverse(root->left); AfterTraverse(root->right); cout<<root->value<<" "; } void AfterTraverseWithoutRecursion(struct BtreeNode *root){ if(NULL == root){ return; } stack<struct BtreeNode *> record; struct BtreeNode *pre = NULL; struct BtreeNode *tmp = root; while(tmp != NULL){ record.push(tmp); tmp = tmp->left; } while(!record.empty()){ tmp = record.top(); //右子树为空,可以直接输出 if(tmp->right == NULL){ cout<<tmp->value<<" "; pre = tmp; record.pop(); }else{ //右子树已经全部访问了,可以直接输出 if(tmp->right == pre){ cout<<tmp->value<<" "; pre = tmp; record.pop(); }else{ tmp = tmp->right; while(tmp != NULL){ record.push(tmp); tmp = tmp->left; } } } } } int main(){ struct BtreeNode *root = NULL; insertNode(&root, 6); insertNode(&root, 9); insertNode(&root, 3); //insertNode(&root, 2); insertNode(&root, 5); insertNode(&root, 7); //insertNode(&root, 12); preTraverse(root); cout<<endl; preTraverseWithoutRecursion(root); cout<<endl; inTraverse(root); cout<<endl; inTraverseWithoutRecursion(root); cout<<endl; AfterTraverse(root); cout<<endl; AfterTraverseWithoutRecursion(root); cout<<endl; }