#pragma mark - 树的结构体
typedef struct BiNode{
int data;
struct BiNode *lchild;
struct BiNode *rchild;
}BiNode,*BiTree;
typedef struct Stack{
int *data;
}Stack;
#pragma mark - 栈的相关操作
void InitStack(Stack S);
BOOL StackEmpty(Stack S);
BOOL GetTop(Stack S,BiTree &T);
void Pop(StackS,BiTree&T);
void Push(Stack S,BiTree &T);
#pragma mark - 树的遍历递归算法
//1.
void PreOrderTraverse1(BiTree T){
if(T) {
printf("%d",T->data);
PreOrderTraverse1(T->lchild);
PreOrderTraverse1(T->rchild);
}
}
//2.
void InOrderTraverse1(BiTree T){
if(T) {
InOrderTraverse1(T->lchild);
printf("%d",T->data);
InOrderTraverse(T->rchild);
}
}
//3.
void PostOrderTraverse1(BiTreeT){
if(T) {
PostOrderTraverse1(T->lchild);
PostOrderTraverse1(T->rchild);
printf("%d",T->data);
}
}
#pragma mark - 树的遍历非递归算法
//1.先序遍历非递归算法
void PreOrderTraverse(BiTreeT){
//初始化栈
Stack S;
InitStack(S);
Push(S,T);
while(!StackEmpty(S)) {
//1.栈中取出第一个元素
BiTree p;
while(GetTop(S,p) && p !=NULL) {
//2.打印
printf("%d",p->data);
//3.把左子树放入到堆中
Push(S,p->lchild);
}
//4.推出当前栈顶空元素
pop(S,p);
//5.判断当前栈是不是空
if(!stackEmpty(S)) {
//6.取出栈顶元素
Pop(S,p);
//7.把栈顶元素右子树放入栈中
Push(S,p->rchild);
}
}
}
//2.中序遍历的非递归算法
void InOrderTraverse(BiTree T){
//初始化栈
Stack S;
InitStack(S);
Push(S,T);
while(!StackEmpty(S)) {
//1.栈中取出第一个元素
BiTree p;
//2.把左子树放入到堆中
while(GetTop(S,p) && p !=NULL) {
Push(S,p->lchild);
}
//3.推出当前栈顶空元素
Pop(S,p);
//4.判断当前栈是不是空
if(!StackEmpty(S)) {
//5.取出栈顶元素
Pop(S,p);
//6.打印
printf("%d",p->data);
//7.把栈顶元素右子树放入栈中
Push(S,p->rchild);
}
}
}