二叉树的遍历(非递归)
写在前面
二叉树重要,重要,重要。以下代码每日手撸一遍,深刻理解。
二叉树的先序遍历(非递归)
巧记心法
- 判断是否为空树
- 1、右侧入栈(访问,q指向右孩子,不空则入栈)
- 2、p指向左孩子,为空则弹栈
#define MAX_NODE 50;
void preorderTraverse(BTNode *T){
BTNode *stack[MAX_NODE],*p=T,*q;
int top=0;
if(T==NULL){
printf("Empty");
}
else{
do{
visit(p->data);
q=p->Rchild;
if(q!=null){
//入栈
stack[++top]=q;
}
p=p->Lchild;
if(p==NULL){
//弹栈
p=stack[top];
top--;
}
}while(p!=NULL);
}
}
二叉树的中序遍历(非递归)
巧记心法
- 判断是否为空树
- 1、左侧全部入栈
- 2、当全部出栈时(top=0),设置循环结束标志(bool=0)
- 3、否则出栈,访问,p指向右孩子
#define MAX_NODE 50;
void InorderTraverse(BTNode *T){
BTNode *stack[MAX_NODE],*p=T;
int bool=1,top=0;
if(T==NULL)
printf("Empty");
else{
do{
while(p!=NULL){
//左侧全部入栈
stack[++top]=p;
p=p->Lchild;
}
if(top==0) bool=0;
else{
p=stack[top];
top--;
visit(p->data);
p=p->Rchild;
}
}while(bool!=0);
}
}
二叉树的后序遍历(非递归)
巧记心法
- 判断二叉树是否为空
- 1、左侧全部入栈,且S2全部赋予0
- 2、当全部出栈时设置循环结束(bool=0)
- 3、当对应top为0时,p指向S1[top]对应的右孩子,S2[top]=1
- 4、否则出栈访问,p=null
#define MAX_NODE 50
void PostorderTraverse(BTNode *T){
BTNode *S1[MAX_NODE],*p=T;
int S2[MAX_NODE],top=0,bool=1;
if(T==NULL)
printf("Empty");
else{
do{
while(p!=NULL){
S1[++top]=p;
p=p->Lchild;
S2[top]=0;
}
if(top==0)
bool=0;
else if(S2[top]==0){
p=S1[top]->Rchild;
S2[top]=1;
}
else{
p=S1[top];
top--;
visit(p->data);
p=NULL;
}
}while(bool!=0);
}
二叉树的层次遍历
巧记心法
- 判断二叉树是否为空
- 1、根结点入队列
- 2、当队列不空时(front<rear)队首元素出队,p=队首元素,访问p
- 3、若p的左孩子不空则入队
- 4、若p的右孩子不空则入队
#define MAX_NODE 50
void levelorderTraverse(BTNode *T)
{
BTNode *Queue[MAX_NODE],*p=T;
int front=0,rear=0;
if(T==NULL)
printf("Empty");
else{
Queue[++rear]=p;
while(front<rear){
p=Queue[++front];
visit(p->data);
if(p->Lchild!=NULL)
Queue[++rear]=p->Lchild;
if(p->Rchild!=NULL)
Queue[++rear]=p->Rchild;
}
}
}