#include<iostream> #include<stdlib.h> #define maxsize 100 using namespace std; typedef struct BTNode{ char val; BTNode *lchild, *rchild; }*BiTNode; void CreateTree(BTNode *&root){ char c; cin >> c; if(c == '#') root = NULL; else{ root = (BTNode *) malloc(sizeof(BTNode)); if(!root){ cerr << "No More Memory!" << endl; exit(-1); } root->val = c; CreateTree(root->lchild); CreateTree(root->rchild); } } void PreOrderRecursion(BTNode *root){ if(root){ cout << root->val << " "; PreOrderRecursion(root->lchild); PreOrderRecursion(root->rchild); } } void PreOrderNoRecursion(BTNode *root){ if(!root){ cout << "Root is NULL!" << endl; return; } BTNode* stack[maxsize]; //模拟一个栈 int top = -1; //栈顶指针 stack[++top] = root; while(top != -1){ BTNode *p = stack[top--]; cout << p->val << " "; if(p->rchild) //由于左子树先被访问,则右子树应该先入栈 stack[++top] = p->rchild; if(p->lchild) stack[++top] = p->lchild; } } void InOrderRecursion(BTNode *root){ if(root){ InOrderRecursion(root->lchild); cout << root->val << " "; InOrderRecursion(root->rchild); } } void InOrderNoRecursion(BTNode *root){ if(!root){ cout << "Root is NULL!" << endl; return; } BTNode* stack[maxsize]; int top = -1; BTNode *p = root; while(top != -1 || p != NULL){ while(p){ stack[++top] = p; p = p->lchild; } //从根节点一直往左子树遍历,如果没有左子树 //打印这个节点,往右节点移动 p = stack[top--]; cout << p->val << " "; p = p->rchild; } } void PostOrderRecursion(BTNode *root){ if(root){ PostOrderRecursion(root->lchild); PostOrderRecursion(root->rchild); cout << root->val << " "; } } void PostOrderNoRecursion(BTNode *root){ if(!root){ cout << "Root is NULL!" << endl; return; } BTNode* stack1[maxsize]; int top1 = -1; BTNode* stack2[maxsize]; int top2 = -1; //首先把根节点如stack1 stack1[++top1] = root; while(top1 != -1){ BTNode *p = stack1[top1--]; stack2[++top2] = p; if(p->lchild) stack1[++top1] = p->lchild; if(p->rchild) stack1[++top1] = p->rchild; } //此时倒序输出stack2即为后序遍历的序列 while(top2 != -1){ BTNode *p = stack2[top2--]; cout << p->val << " "; } } int main(){ BTNode *root; CreateTree(root); /** test code */ return 0; }
来源:https://www.cnblogs.com/dotdashdotdash/p/11863592.html