当前位置: 首页 > news >正文

【数据结构 二叉树 递归与非递归遍历】

二叉树 递归与非递归遍历

  • 0二叉树结构体定义
  • 1.递归遍历
    • 先序(访问根结点,先序遍历左子树,先序遍历右子树)
    • 中序(中序遍历左子树,访问根结点,中序遍历右子树)
    • 后序(后序遍历左子树,后序遍历右子树,访问根结点)
  • 2.非递归遍历
    • 先序遍历
    • 中序遍历
    • 后序遍历

0二叉树结构体定义

typedef struct BTNode{
   int data;
   struct BTNode * lchild;
   struct BTNode * rchild;
}BTNode;

1.递归遍历

先序(访问根结点,先序遍历左子树,先序遍历右子树)

void PreOrder(BTNodey T){
   if(T!=NULL){
       visit(T);
       preOrder(T->lchild);
       preOrder(T->rchild);
   }
}

中序(中序遍历左子树,访问根结点,中序遍历右子树)

void InOrder(BTNode T){
   if(T!=NULL){
       InOrder(T->lchild);
       visit(T);
       InOrder(T->rchild);
   }
}

后序(后序遍历左子树,后序遍历右子树,访问根结点)

void PostOrder(BTNode T){
   if(T!=NULL){
       PostOrder(T->lchild);
       PostOrder(T->rchild);
       visit(T);
   }
}

2.非递归遍历

先序遍历

  1. 沿着根的左孩子,先访问并依次入栈,直到左孩子为空(一直到最下层的左孩子停止);
    2.(判断:没有右子树了) 栈顶元素出栈,接着若右孩子为空,继续执行2;若不为空,将右子树的操作转为1;
// 先序遍历(非递归)
void PreOrder(BTNode T) {
    LinkStack S;
    // 初始化栈
    InitStack(S);
    // 遍历指针
    BTNode p = T;
    // 树和链表有一者不为空则循环继续进行
    while(p || !IsEmpty(S)) {
   
        if(p) {
            visit(p);
            Push(S, p);
            p = p->lchild;
        } else {
            Pop(S, p);
            p = p->rchild;
        }
    }
}

中序遍历

  1. 沿着根的左孩子,依次入栈,直到左孩子为空(一直到最下层的左孩子停止);
    2.(判断:没有左子树了) 栈顶元素出栈并访问,接着若右孩子为空,继续执行2;若不为空,将右子树的操作转为1;
// 中序遍历(非递归)
void InOrder(BTNode T) {
    LinkStack S;
    // 初始化栈
    InitStack(S);
    // 遍历指针
    BTNode p = T;
    // 树和链表有一者不为空则循环继续进行
    while(p || !IsEmpty(S)) {

        if(p) {
            Push(S, p);
            p = p->lchild;
        } else {
            Pop(S, p);
            visit(p);
            p = p->rchild;
        }
    }
}

后序遍历

  1. 沿着根的左孩子,依次入栈,直到左孩子为空(一直到最下层的左孩子停止);
    2.读取栈顶元素:若其右孩子不空且未被访问过,将右子树转执行1;否则,栈顶元素出栈并访问。 ;
// 后序遍历(非递归)
void PostOrder(BTNode T) {
    LinkStack S;
    // 初始化栈
    InitStack(S);
    // 遍历指针
    BTNode p = T;
    // 辅助指针,用于记录最近访问过的结点
    BTNode r = NULL;
    // 树和链表有一者不为空则循环继续进行
    while(p || !IsEmpty(S)) {
   
        if(p) {
            Push(S, p);
            p = p->lchild;
        } else {
            // 注意:此处是读取栈顶结点,而并非出栈
            GetTop(S, p);
            // 若右子树存在且未被访问过
            // 则以上述步骤开始访问其右子树
            // 否则,将栈顶结点出栈并访问
            if(p->rchild && p->rchild != r) {
                p = p->rchild;
            } else {
                Pop(S, p);
                visit(p);
                // 记录最近访问过的结点
                r = p;
                // 结点访问完成后,重置p指针
                // 由于每次出栈访问完一个结点就相当于遍历完以该结点为根的子树,所以需要将p重置
                p = NULL;
            }
        }
    }
}

相关文章:

  • 微信公众号消息推送教程
  • MiddleWare ❀ Zookeeper基础概述
  • 多任务学习算法在推荐系统中的应用
  • webpack5入门教程
  • Python解决多个服务线程/进程重复运行定时任务的问题
  • webpack学习笔记
  • 01人机交互/打开CMD/常见CMD命令/CMD打开QQ并设置环境变量
  • QT汽车客运公司售票系统(改良版)
  • 初始Cpp之 六、内存分配
  • 【算法】重载sort的cmp的题
  • STC15单片机-LED闪烁(定时器)
  • Android 移动安全攻防实战 第一章
  • Docker 容器技术
  • 基于springboot的少儿识字系统
  • Hyperledger Besu环境搭建(Linux)
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • gcc介绍及安装
  • Git 使用集
  • JavaScript HTML DOM
  • jquery ajax学习笔记
  • js正则,这点儿就够用了
  • LeetCode算法系列_0891_子序列宽度之和
  • python学习笔记 - ThreadLocal
  • Vue.js-Day01
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 阿里云Kubernetes容器服务上体验Knative
  • 关于for循环的简单归纳
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 推荐一个React的管理后台框架
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • MPAndroidChart 教程:Y轴 YAxis
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​香农与信息论三大定律
  • # centos7下FFmpeg环境部署记录
  • (06)金属布线——为半导体注入生命的连接
  • (10)ATF MMU转换表
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (三)elasticsearch 源码之启动流程分析
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (原)本想说脏话,奈何已放下
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)JAVA中的堆栈
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .bat文件调用java类的main方法
  • .NET : 在VS2008中计算代码度量值
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET6实现破解Modbus poll点表配置文件
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • .考试倒计时43天!来提分啦!
  • @Autowired自动装配