/*
43.递归和非递归俩种方法实现二叉树的前序遍历。
*/
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<queue>
using namespace std;
#define MAX 20
struct BTreeNode{
int data;
BTreeNode *left,*right;
};
//建立二叉树
BTreeNode * CreateTree(int data[],int pos,int len)
{
BTreeNode *tree;
if(pos>=len)
{
return NULL;
}
else
{
tree=(BTreeNode *)malloc(sizeof(BTreeNode));
tree->data=data[pos];
tree->left=CreateTree(data,2*pos+1,len);//数组坐标
tree->right=CreateTree(data,2*pos+2,len);
return tree;
}
}
// 递归版本比较简单
void preOrder(BTreeNode *tree)
{
if(tree!=NULL)
{
printf("%d ",tree->data);
preOrder(tree->left);
preOrder(tree->right);
}
}
void preorderNonrecursive(BTreeNode *tree)
{
stack<BTreeNode* > s;
s.push(tree);
while(!s.empty())
{
BTreeNode* n;
n=s.top();
s.pop();
printf("%d ",n->data);//因为是栈,所以先如右边的,后左边的,则先出左边的
if(n->right!=NULL) s.push(n->right);
if(n->left!=NULL) s.push(n->left);
}
}
void inorderNonrecursive(BTreeNode* tree) //左根右
{
stack<BTreeNode* > s;
BTreeNode* current=tree;
while(!s.empty()||current!=NULL)
{
if(current!=NULL)
{
s.push(current);// 根先进,在继续左孩子,直到为空
current=current->left;
}
else
{
current=s.top();
s.pop();
printf("%d ",current->data);// 根
current=current->right;//右
}
}
}
void postorderNonrecursive(BTreeNode * tree) //左右根
{
// visiting occurs only when current has no right child
//or last visited is his right child
stack<BTreeNode *> sTraverse, sVisit;
sTraverse.push(tree);
while (!sTraverse.empty())
{
BTreeNode* p=sTraverse.top();
sTraverse.pop();
sVisit.push(p);//左右根 根先进 右进 左进
if (p->left!=NULL) sTraverse.push(p->left);
if (p->right!=NULL) sTraverse.push(p->right);
}
while(!sVisit.empty())
{
printf("%d ",sVisit.top()->data);
sVisit.pop();
}
}
int main(){
/*
8
6 10
5 7 9 11
12 3 1 2 4
前:8 6 5 12 3 7 1 2 10 9 4 11
中:12 5 3 6 1 7 2 8 4 9 10 11
后:12 3 5 1 2 7 6 4 9 11 10 8
*/
int data[]={8,6,10,5,7,9,11,12,3,1,2,4};
int len=sizeof(data)/sizeof(int);
BTreeNode *tree=CreateTree(data,0,len);
printf("前序遍历(递归):\n");//根左右
preOrder(tree);printf("\n");
printf("前序遍历(非递归):\n");//根左右
preorderNonrecursive(tree);printf("\n");
printf("中序遍历(非递归):\n");//左根右
inorderNonrecursive(tree);printf("\n");
printf("后序遍历(非递归):\n");//左右根
postorderNonrecursive(tree);printf("\n");
return 0;
}
