二叉树
- 先序遍历
递归算法代码
void preorder(BTNode *p){
if(p!=null){
visit(p);//访问根节点
preorder(p->lchild);//访问左子树
preorder(p->rchild);//访问右子树
}
}
非递归算法代码
void preorder(BTNode* bt){
int stack[maxSize];
int top=-1;
BTNode* p=bt;
stack[++top]=bt;
while(top!=-1){
p=stack[top--];
visit(p);
if(p->rchild!=null){
stack[++top]=p->rchild;
}
if(p->lchild!=null){
stack[++top]=p->lchild;
}
}
}
- 中序遍历
递归算法代码
void inorder(BTNode *p){
if(p!=null){
preorder(p->lchild);//访问左子树
visit(p);//访问节点
preorder(p->rchild);//访问右子树
}
}
非递归算法代码
void inorder(BTNode *bt){
int stack[maxSize];
int top=-1;
BTNode* p=bt;
while(p!=null||top!=-1){//左子树入栈
stack[++top]=p;
p=p->lchild;
}
while(top!=-1){//访问完根节点转到右子树
p=stack[top--];
visit(p);
p=p->rchild;
}
}
- 后序遍历
递归算法代码
void postorder(BTNode *p){
if(p!=null){
postorder(p->lchild);//访问左子树
postorder(p->rchild);//访问右子树
visit(p);//访问根节点
}
}
非递归算法代码
void postorder(BTNode* bt){
int stack1[maxSize];
int top1=-1;
int stack2[maxSize];
int top2=-1;
BTNode* p=bt;
p=stack1[++top1];
while(top!=-1){
p=stack1[top1--];
stack2[++top2]=p;
if(p->lchild!=null){
stack1[++top1]=p->lchild;
}
if(p->rchild!=null){
stack1[++top1]=p->rchild;
}
}
while(top2!=-1){
p=stack2[top2--];
visit(p);
}
}
- 层次遍历
void levelorder(BTNode * p){
int que[maxSize];
int rear, front;
rear=front=0;
BTNode* q
rear=(rear+1)%maxSize;
que[rear]=p;
while(rear!=front){
front=(front+1)%maxSize;
q=que[front];
visit(q);
if(q->lchild!=null){
rear=(rear+1)%maxSize;
que[rear]=q->rchild;
}
if(q->lchild!=null){
rear=(rear+1)%maxSize;
que[rear]=q->rchild;
}
}
}