#include<stdio.h>
#include<string.h>
#include<stdlib.h>
// (int *p;)==(typedef int *Pint; Pint p;)
typedef struct BTNode *BTree;
typedef struct BTNode{
int data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
//先续dfs,栈实现
void dfs_first(BTree b){
int stk_size=100005;
BTNode *stk[stk_size];
int top=-1;
stk[++top]=b;
while(top!=-1){
BTNode *p=stk[top];
printf("node1:%d\n",stk[top]->data);
top--;
if(p->rchild!=NULL){
stk[++top]=p->rchild;
}
if(p->lchild!=NULL){
stk[++top]=p->lchild;
}
}
}
//中序续dfs,栈实现
void dfs_mid(BTree b){
int stk_size=100005;
BTNode *stk[stk_size];
int top=-1;
BTNode *p=b;
while(top!=-1||p!=NULL){
while(p!=NULL){
stk[++top]=p;
p=p->lchild;
}
if(top!=-1){
p=stk[top];top--;
printf("node2:%d\n",p->data);
p=p->rchild;
}
}
}
//后续dfs,栈实现:先序逆序后交换左右子树
void dfs_after(BTree b){
int stk_size=100005;
BTNode *stk[stk_size],*t[stk_size];
int top=-1,ttop=-1;
stk[++top]=b;
while(top!=-1){
BTNode *p=stk[top];
t[++ttop]=p;
top--;
if(p->lchild!=NULL){
stk[++top]=p->lchild;
}
if(p->rchild!=NULL){
stk[++top]=p->rchild;
}
}
while(ttop!=-1){
printf("node3:%d\n",t[ttop--]->data);
}
}
BTree buildBT(){
int x;scanf("%d",&x);
BTNode *b;
b=NULL;
if(x==-1) {
return b;
}
b=(BTNode*)malloc(sizeof(BTNode));
b->data=x;
b->lchild=buildBT();
b->rchild=buildBT();
return b;
}
//1 3 7 10 -1 -1 -1 6 -1 -1 5 -1 8 -1 -1
int main(){
BTNode *b=buildBT();
dfs_first(b);
dfs_mid(b);
dfs_after(b);
return 0;
}
MyDS 用栈实现二叉树的前中后序遍历
最新推荐文章于 2022-07-08 09:55:05 发布