数据结构之二叉树的遍历

一、二叉树的遍历

遍历:顺着某一条搜索路径巡访二叉树中的结点,使的每个结点均被访问一次,而且仅被访问一次。

遍历的目的:得到树中所有结点的一个线性排序

遍历的作用:是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心

一般讨论三种遍历方案:1.根左右,2.左根右,3.左右根

 知道先序序列和中序序列,或者后序序列和中序序列可以唯一确定一颗二叉树

1.算法实现(递归)

1.按照 根左右 进行遍历

Status PreOrderTraverse (BiTree T) {
    if(T == NULL) return OK // 空二叉树
    else {
    visit(T)// 访问根结点
    PreOrderTraverse (T -> lchild)     // 递归遍历左子树
    PreOrderTraverse (T- >rchild)    // 递归遍历右子树
    }
}

 

 2.按照 左根右 进行遍历

Status InOrderTraverse (BiTree T) {
    if(T == NULL) return OK // 空二叉树
    else {
    PreOrderTraverse (T -> lchild)     // 递归遍历左子树 
    visit(T)// 访问根结点
    PreOrderTraverse (T- >rchild)    // 递归遍历右子树
    }
}

3.按照 左右根  进行遍历

Status PreOrderTraverse (BiTree T) {
    if(T == NULL) return OK // 空二叉树
    else {
    PreOrderTraverse (T -> lchild)     // 递归遍历左子树
    PreOrderTraverse (T- >rchild)    // 递归遍历右子树 
    visit(T)// 访问根结点
    }
}

4.总结

如果去掉访问根结点的语句,三种算法是完全相同的,或者说这三种算法的访问路径是相同的,只是访问结点的时机不同。

2.算法(非递归)

1.中序遍历的非递归算法

通过栈来实现,遇到一个元素,将其入栈,如果入栈元素的后续的子结点为空将其出栈

3.二叉树的层次遍历

思路:将根结点进队,
          队不为空时循环,从队列中出一个结点*p,访问它;
          若它有左孩子结点,将左孩子结点进队,若它有右孩子结点,将右孩子结点进队,否则出队。

void LevelOrder(BTNode *b) {
    BTNode *p; SqQueue *qu;
    InitQueue(qu);                    // 初始化队列
    enQueue(qu,b);                    // 根结点指针进入队列
    while(!QueueEmpty(qu)) {          // 如果队列不为空,则循环
    deQueue(qu,p);                    // 出队结点p
        printf("%C",p->data)          // 访问结点P
        if(p->lchild != NULL) enQueue(qu, p->lchild) // 有左孩子时将其进队
        if(p->lchild != NULL) enQueue(qu, p->rchild) // 有右孩子时将其进队
    }
}

 

posted @   铜须的编程生活  阅读(241)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示