遍历二叉树的代码实现

简介: 遍历二叉树的代码实现

先序遍历(根--左--右)

递归法

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);    //右孩子入队
        }
    }            
}
目录
相关文章
|
Web App开发 自然语言处理 监控
基于 WebAssembly 的AIoT应用框架实践
天猫精灵大前端团队基于 WebAssembly 的AIoT应用框架实践分享。
基于 WebAssembly 的AIoT应用框架实践
|
10月前
|
存储 人工智能 算法
告别模糊检索:深度拆解向量数据库,手把手教你选对AI底座
本文深入解析向量数据库在大模型时代的关键作用,揭示其作为AI“外挂大脑”的原理与价值。从技术原理、选型维度到RAG全链路实践,结合Elasticsearch与LLaMA-Factory等工具,手把手教你构建专属AI系统,助力迈向场景化智能。
505 1
|
12月前
|
缓存 编解码 并行计算
《AMD显卡游戏适配手册:解决画面闪烁、着色器编译失败的核心技术指南》
本文聚焦游戏跨显卡适配中的典型痛点,针对NVIDIA显卡运行流畅、AMD显卡却出现画面闪烁、着色器编译失败等问题,深度拆解底层成因与根治方案。文章指出,问题核心源于AMD与NVIDIA的硬件架构(SIMD/SIMT)、指令集支持、驱动优化方向的本质差异,以及开发时单一显卡适配的思维惯性。通过驱动版本精准选型与残留清理、着色器编译规则降级兼容与分卡预编译、纹理压缩格式与渲染设置针对性调整、双显卡同步测试与长效迭代体系搭建等六大核心逻辑,提供从底层技术优化到实操落地的全流程指南。
964 7
|
10月前
|
JSON 监控 API
关键词搜索淘宝商品列表API指南
本API提供合规、高效的淘宝商品关键词搜索服务,支持价格/销量/店铺类型等多维筛选,实时同步价格与销量(延迟<5分钟),返回含标题、主图、SKU等全字段JSON数据,适配选品、比价、运营等场景。(239字)
|
10月前
|
人工智能 JSON 网络协议
AI 大模型 LLM API 深入解析:Gemini 3.0 Pro 的 SSE 流式响应与大模型接口跨区域延迟优化实践
本文对比Google Vertex AI与OpenAI在SSE协议处理上的差异,针对跨洋网络高延迟问题,提出通过聚合层优化TTFT。结合GRPC与REST的适配挑战,引入协议转换网关,实测P99延迟降低75%,显著提升连接稳定性与首 token 速度。
722 2
|
12月前
|
人工智能 自然语言处理 监控
2025年11月,中国数字人平台创新应用已成为生活多面助手
数字人正深度融入教育、医疗、金融、文旅等八大领域,重塑工作、学习与社交方式。从虚拟教师到AI医生,从智能理财到数字孪生,它们以个性化服务推动社会效率跃升。随着技术演进,数字人将从工具进化为懂人类的协作伙伴,开启人机共生新文明。
|
传感器 机器学习/深度学习 算法
【指纹识别】指纹细节提取(Matlab代码实现)
【指纹识别】指纹细节提取(Matlab代码实现)
736 4
|
数据安全/隐私保护
Excel中如何设置随机密码
Excel中如何设置随机密码
|
消息中间件 编解码 开发者
深入解析 Flutter兼容鸿蒙next全体生态的横竖屏适配与多屏协作兼容架构
本文深入探讨了 Flutter 在屏幕适配、横竖屏切换及多屏协作方面的兼容架构。介绍了 Flutter 的响应式布局、逻辑像素、方向感知、LayoutBuilder 等工具,以及如何通过 StreamBuilder 和 Provider 实现多屏数据同步。结合实际应用场景,如移动办公和教育应用,展示了 Flutter 的强大功能和灵活性。
802 6
|
监控 安全 物联网
物联网卡应用中一些常见限制
物联网卡(IoT SIM卡)在实际应用中,除了APN配置的多样性外,还受到多种限制和约束。这些限制通常与网络运营商的政策、服务条款、技术实现以及安全需求紧密相关。以下是一些常见的物联网卡限制: