非递归实现二叉树遍历

简介: 非递归实现二叉树遍历

Traversal

注意stack弹出的顺序决定是如何遍历


先序

思路

  1. 取二叉树根节点入栈
  2. pop栈顶数据Top
  3. 先入Top右,再入Top

重复2、3步骤,直到栈为空


实现

void PreOrderUnRecur(Node* root)
{
    if(root != null)
    {
        stack<Node*> cons;
        cons.push(root);
        while(!cons.empty())
        {
            Node* Top = cons.top();
            cons.pop();
            cout << Top->value << " ";
            if(Top->right) cons.push(Top->right);
            if(Top->left) cons.push(Top->left);
        }
    }
}


后序

思路

使用两个栈 conshelp

  1. 根节点入栈cons
  2. pop数据Tophelp
  3. 先入Top左,再入Top右,均入cons

重复步骤2、3,直到cons没有数据,依次拿出help中的数据


实现

void PostOrderUnRecur(Node* root)
{
    if(root != null)
    {
        stack<Node*> cons;
        stack<Node*> help;
        cons.push(root);
        while(!cons.empty())
        {
            Node* Top = cons.top();
            cons.pop();
            help.push(Top);
            if(Top->left) cons.push(Top->left);
            if(Top->right) cons.push(Top->right);
        }
        while(!help.empty())
        {
            Node* val = help.top();
            help.pop();
            cont << val->value << " ";
        }
    }
}


总结

栈入数据的顺序是和弹出时的顺序是相反的。

弹出的顺序即决定是先序遍历还是后续遍历

先序遍历 -- -- 头左右 -- -- 要求入栈顺序:头右左

后序遍历 -- -- 左右头 -- -- 要求入栈顺序:头左右 -- -- 得到出栈顺序:头右左 -- -- help反转出栈顺序


中序

思路

首先根节点的所有左节点入栈

  • pop节点Top,把Top节点的右子树的左节点入栈

重复上面的步骤,直到栈为空


实现

void InOrderUnRecur(Node* root)
{
    if(root != nullptr)
    {
        stack<Node*> cons;
        Node* cur = root;
        while(!cons.empty() || cur != nullptr)
        {
            if(cur == nullptr)
            {
                Node* Top = cons.top();
                cons.pop();
                cout << Top->value <<" ";
                cur = Top->right;
            }
            else
            {
                cons.push(cur);
                cur = cur->left;
            }
        }
    }
}


总结

对于一个节点Node和它的左节点LNode、右节点RNode,出栈的顺序: LNode -> Node -> RNode,也可以说是处理这个节点的顺序

目录
相关文章
|
Web App开发 前端开发 JavaScript
是时候好好安利下 LuLu UI 框架了!
LuLu UI是一个基于jQuery,针对PC网站,兼容IE8+或IE7+的前端UI框架,包含20+静态或动态UI组件。
1861 0
|
缓存 算法 Linux
Linux内存管理之页面回收【转】
转自:http://blog.csdn.net/bullbat/article/details/7311205 请求调页机制,只要用户态进程继续执行,他们就能获得页框,然而,请求调页没有办法强制进程释放不再使用的页框。
1034 0
|
9月前
|
小程序 UED 开发者
微信小程序如何分包管理
微信小程序如何分包管理
莫比乌斯环
关于莫比乌斯环,我们可以做个试验:找一条纸条,将其扭转180度,然后将两端对接,这样就得到一个莫比乌斯环.你若细看就会发现一个秘密:假如你站在莫比乌斯环上,向一个方向走,会永远走不到头.因为莫比乌斯环只有一个面!当然在理想条件下啦.因为现实中纸条都有一定的厚度啦。
1025 0
|
3天前
|
人工智能 自然语言处理 Shell
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
仅用3分钟,百炼调用满血版Deepseek-r1 API,享受百万免费Token。阿里云提供零门槛、快速部署的解决方案,支持云控制台和Cloud Shell两种方式,操作简便。Deepseek-r1满血版在推理能力上表现出色,尤其擅长数学、代码和自然语言处理任务,使用过程中无卡顿,体验丝滑。结合Chatbox工具,用户可轻松掌控模型,提升工作效率。阿里云大模型服务平台百炼不仅速度快,还确保数据安全,值得信赖。
133605 24
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
|
5天前
|
人工智能 API 网络安全
用DeepSeek,就在阿里云!四种方式助您快速使用 DeepSeek-R1 满血版!更有内部实战指导!
DeepSeek自发布以来,凭借卓越的技术性能和开源策略迅速吸引了全球关注。DeepSeek-R1作为系列中的佼佼者,在多个基准测试中超越现有顶尖模型,展现了强大的推理能力。然而,由于其爆火及受到黑客攻击,官网使用受限,影响用户体验。为解决这一问题,阿里云提供了多种解决方案。
16296 37
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
|
4天前
|
并行计算 PyTorch 算法框架/工具
本地部署DeepSeek模型
要在本地部署DeepSeek模型,需准备Linux(推荐Ubuntu 20.04+)或兼容的Windows/macOS环境,配备NVIDIA GPU(建议RTX 3060+)。安装Python 3.8+、PyTorch/TensorFlow等依赖,并通过官方渠道下载模型文件。配置模型后,编写推理脚本进行测试,可选使用FastAPI服务化部署或Docker容器化。注意资源监控和许可协议。
1244 8
|
13天前
|
人工智能 搜索推荐 Docker
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
DeepSeek R1 + LobeChat + Ollama:快速本地部署模型,创建个性化 AI 助手
3386 117
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手

热门文章

最新文章