测试例子:输入ab#d##c#e##
输出:abdce
bdace
dbeca
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<stack>
using namespace std;
struct Node {
Node *rchild;
Node *lchild;
char data;
};
int loc;
#if 0
Node *create()
{
Tree[loc].lchild = Tree[loc].rchild = NULL;
return &Tree[loc++];
}
#endif
Node *createtree(Node *bt)
{
char c;
cin >> c;
if (c == '#') {
bt == NULL;
//return ;
}
else {
bt = new Node;
bt->data = c;
bt->lchild = createtree(bt->lchild);
bt->rchild = createtree(bt->rchild);
}
return bt;
}
void preOrder(Node *bt)
{
if (bt != NULL)
{
printf("%c", bt->data);
if (bt->lchild)
preOrder(bt->lchild);
//printf("%c",bt->data);
if (bt->rchild)
preOrder(bt->rchild);
//printf("%c",bt->data);
}
//printf("\n");
}
void inOrder(Node *bt)
{
if (bt != NULL)
{
//printf("%c",bt->data);
if (bt->lchild)
inOrder(bt->lchild);
printf("%c", bt->data);
if (bt->rchild)
inOrder(bt->rchild);
//printf("%c",bt->data);
}
//printf("\n");
}
void postOrder(Node *bt)
{
if (bt != NULL)
{
//printf("%c",bt->data);
if (bt->lchild)
postOrder(bt->lchild);
//printf("%c",bt->data);
if (bt->rchild)
postOrder(bt->rchild);
printf("%c", bt->data);
}
//printf("\n");
}
//非递归
void PreOrderStack(Node *bt) {
stack<Node*> pre;
Node *cur = bt;
//pre.push(cur);
while (!cur || !pre.empty()) {
while(cur!=null){
printf("%c", cur->data);
pre.push(cur);
cur = cur->lchild;
}
if(!pre.empty()) {
cur = pre.top();
pre.pop();
cur = cur->rchild;
}
}
}
void InOrderStack(Node *bt) {
stack<Node*> In;
Node *cur = bt;
while (!cur || !In.empty()) {
while(cur!=null){
In.push(cur);
cur = cur->lchild;
}
if(!In.empty()) {
cur = In.top();
printf("%c", cur->data);
In.pop();
cur = cur->rchild;
}
}
}
//要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。
//如果P不存在左孩子和右孩子,则可以直接访问它;或者P存 在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。
//若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了 每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。
void PostOrderStack(Node *bt) {
stack<Node*> post;
Node *cur = bt;
Node *pre = NULL;
post.push(bt);
while (!post.empty()) {
cur = post.top();
if ((cur->lchild == NULL&&cur->rchild == NULL) || (pre != NULL && (pre == cur->rchild || pre == cur->lchild))) {
printf("%c", cur->data);
post.pop();
pre = cur;
}
else {
if (cur->rchild) //注意栈的先进后出,所以右子树先进
post.push(cur->rchild);
if (cur->lchild)
post.push(cur->lchild);
}
}
}
int main()
{
loc = 0;
Node *bt;
bt = createtree(bt);
preOrder(bt);
printf("\n");
inOrder(bt);
printf("\n");
postOrder(bt);
printf("\n");
//system("pause");
return 0;
}