遍历二叉树的代码实现
【摘要】 遍历二叉树的代码实现
@TOC
先序遍历(根–左--右)
递归法
void PreOrder(BiTree T){
if(T != NULL){
visit(T); //访问根节点
PreOrder(T->lchild); //递归遍历左子树
PreOrder(T->rchild); //递归遍历右子树
}
}
非递归法
void PreOrder(BiTree T){
InitStack(S); //使用栈存储二叉树的节点
BiTree p = T; //p为遍历二叉树的指针
while(p || !IsEmpty(S)){ //二叉树不为空或栈不空是继续循环
if(p != NULL){
vist(p) //访问拍p
Push(S,p); //p节点入栈
p = p->lchild; //继续向左遍历
}
else{
Pop(S,p); //p出栈
p = p->rchild; //转向右子树遍历
}
}
}
中序遍历(左–根--右)
递归法
void InOrder(BiTree T){
if(T != NULL){
InOrder(T->lchild); //递归遍历左子树
visit(T); //访问根节点
InOrder(T->rchild); //递归遍历右子树
}
}
非递归法
void InOrder(BiTree T){
InitStack(S); //使用栈存储二叉树的节点
BiTree p = T; //p为遍历二叉树的指针
while(p || !IsEmpty(S)){ //二叉树不为空或栈不空是继续循环
if(p != NULL){
Push(S,p); //p节点入栈
p = p->lchild; //继续向左遍历
}
else{
Pop(S,p); //p出栈
visit(p); //访问p
p = p->rchild; //转向右子树遍历
}
}
}
后序遍历(左–右--根)
递归法
void PostOrder(BiTree T){
if(T != NULL){
PostOrder(T->lchild); //递归遍历左子树
PostOrder(T->rchild); //递归遍历右子树
visit(T); //访问根节点
}
}
非递归法
void PostOrder(BiTree T){
InitStack(S); //使用栈存储二叉树的节点
BiTree p = T; //p为遍历二叉树的指针
BiTree r = NULL; //记录最近访问的节点
while(p || !IsEmpty(S)){ //二叉树不为空或栈不空是继续循环
if(p != NULL){
Push(S,p); //p节点入栈
p = p->lchild; //继续向左遍历
}
else{
GetTop(S,p); //读取栈顶节点,不出栈
if(p->rchild && p->rchild != r){ //右子树存在,且未被访问
p = p->rchild;
Push(S,p); //p节点入栈
p = p->lchild; //转左遍历
}
else{
Pop(S,p); //p出栈
visit(p); //访问p
r = p; //记录最近一次访问的节点
p = NULL;
}
}
}
}
层序遍历
void LevelOrder(BiTree T){
InitQueue(Q); //使用队列存储二叉树节点
BiTree p;
EnQueue(Q,T); //根节点入队
while(!IsEmpty(Q)){ //队列不空继续循环
DeQueue(Q,p); //队头节点出队
vist(p); //访问队头节点
if(p->lchild != NULL){
EnQueue(Q,p->lchild); //左孩子入队
}
if(p->rchild != NULL){
EnQueue(Q,p->rchild); //右孩子入队
}
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)