1.二叉树创建,节点为空#代替,前序创建;例如:ab#cd##e##f## #include <iostream> #include <stack> using namespace std; typedef struct TreeNode { char data; bool tag; struct TreeNode *left; struct TreeNode *right; }TreeNode,*PTreeNode; TreeNode* CreatBitTree(); void Post(PTreeNode root);//后序遍历 void main() { PTreeNode root = CreatBitTree(); //PreTree(root); Post(root); } /* 递归前序建立二叉树 */ TreeNode* CreatBitTree() { char ch; TreeNode *b; scanf("%c", &ch); /* 遇到空节点停止递归 */ if (ch == '#') { b = NULL; } else { b = (TreeNode*) malloc(sizeof(TreeNode)); /* 建立根节点 */ b->data = ch; /* 递归先序建立左子树 */ b->left = CreatBitTree(); /* 递归先序建立右子树 */ b->right = CreatBitTree(); } return b; } 2.后序非递归算法 //非递归后序算法 void Post(PTreeNode root) { stack<PTreeNode> s; TreeNode *p = root; while(true) { while (p)//p不为空,所有左子树入栈 { s.push(p); p->tag=false; p=p->left; } p = s.top(); s.pop(); while(p->tag==true)//右子树返回 { cout<<p->data<<" ";//打印当前节点 if (s.empty()) { return; } p = s.top(); s.pop(); } //左子树返回 p->tag = true;//true:right; false:left s.push(p); p = p->right; } } 3.中序遍历 void MidOrder(TreeNode *root) { PTreeNode p = root; stack<PTreeNode> s; while(p||!s.empty()) { while(p)//左子树入栈 { s.push(p); p=p->left; } p=s.top(); s.pop(); cout<<p->data<<" "; p=p->right; } } 4.前序遍历 void PreOrder(PTreeNode root) { PTreeNode p = root; stack<PTreeNode> s; while(p||!s.empty()) { while (p) { cout<<p->data<<" "; s.push(p); p=p->left; } p=s.top(); s.pop(); p=p->right; } }