非递归方式实现二叉树后序遍历_二叉树递归遍历

非递归方式实现二叉树后序遍历_二叉树递归遍历二叉树前序遍历对于一种数据结构而言,我们最常见的就是遍历,那么关于二叉树我们该如何去遍历呢?请看大屏幕。。。。上图是一棵二叉树,前序遍历结果:124536咦,我想你可能会异或什么叫做前序遍历,其实很简单,就是按照根-》左-》右的方式去遍历二叉树。首先让我们来看看如何递归的去前序遍历二叉树注:在这里我特别强调一点,在我们二…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

二叉树前序遍历

对于一种数据结构而言,我们最常见的就是遍历,那么关于二叉树我们该如何去遍历呢?

请看大屏幕 。。。。

在这里插入图片描述

上图是一棵二叉树,前序遍历结果:1 2 4 5 3 6
咦,我想你可能会疑惑什么叫做前序遍历,其实很简单,就是按照 根 -》 左 -》 右 的方式去遍历二叉树。

  • 首先让我们来看看如何递归的去前序遍历二叉树
    注:在这里我特别强调一点,在我们二叉树中,如果采用递归的方式,大部分都采用的根左右的方式,即采用子问题的方式,即先处理跟节点,再处理左子树,再处理右子树的这样一种思想

  • 前序递归遍历

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int>v;
    vector<int> preorderTraversal(TreeNode* root) {
        if(root!=NULL){
           v.push_back(root->val);      //将根节点放入容器中
           preorderTraversal(root->left);   //处理左子树
           preorderTraversal(root->right);   //处理右子树
        }
        return v;
    }
};

你没看错,就这么简单,但是是如何递归的你得想清楚,这里我就不做详解了。那么接下来我们再看看非递归的方式

  • 前序非递归遍历
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int>v;
        stack<TreeNode*>s;
        TreeNode* cur=root;
        while(cur!=NULL || !s.empty()){
            while(cur!=NULL){
                v.push_back(cur->val);
                s.push(cur);
                cur=cur->left;
            }
            TreeNode* top=s.top();
            s.pop();
            cur=top->right;
        }
        return  v;
    }
};

这就是前序遍历的非递归方式,这种方式主要是采用栈来完成的。这个过程实在不好画图,所以只能靠大家自行理解了,类似一种搞传销的模式,不断的拉下线。。。。可能比喻不太恰当,不过我感觉还挺像的,哈哈!

All OVER

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195236.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 在C#中如何使用BYTE[]转换为String

    在C#中如何使用BYTE[]转换为Stringbyte[]data=newbyte[k];String s=System.Text.Encoding.Default.GetString(data,0,k);

    2022年6月21日
    56
  • java 无锁编程_使用CAS、FAA实现无锁编程

    java 无锁编程_使用CAS、FAA实现无锁编程锁会导致性能降低,在特定情况可用硬件同步原语替代锁,保证和锁一样数据安全,同时提供更好性能。硬件同步原语(AtomicHardwarePrimitives)由计算机硬件提供的一组原子操作,较常用的原语主要是CAS和FAA两种。CAS(CompareandSwap)比较交换FAA原语(FetchandAdd)语义是,先获取变量p当前的值value,然后给变量p增加inc,最后返回变量p之…

    2022年6月3日
    56
  • minio节点扩展_多节点部署定时任务

    minio节点扩展_多节点部署定时任务1.概述分布式Minio可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障。在大数据领域,通常的设计理念都是无中心和分布式。Minio分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。数据保护分布式Minio采用纠删码来防范多个节点宕机和位衰减bitrot。分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。高可用单机Mi..

    2022年10月8日
    4
  • (7)JMeter元件详解之 Interleave Controller 交替控制器

    (7)JMeter元件详解之 Interleave Controller 交替控制器

    2021年7月14日
    103
  • 摘抄自知乎–由华为裁员传闻引发的思考:年轻人如何避免中年危机?

    摘抄自知乎–由华为裁员传闻引发的思考:年轻人如何避免中年危机?原文:https://www.zhihu.com/question/56419319回答者:王辰—-部分摘抄—- HelloJohn: 记得自己的来处,可能不是件坏事。你是知道我的来处的,其他的人,想写我的过去都不那么准确。 他们说我的工作是从9点到5点的,其实从来就不是9点到5点。事实上…

    2022年7月18日
    20
  • docker镜像的导出与导入「建议收藏」

    docker镜像的导出与导入「建议收藏」内网干活的忧桑大概就是偷点懒,使用docker镜像,dockerfile中使用的镜像内网中却没法down下来,so….找个外网机,先把需要的镜像下载下来,再将下载好的镜像载入到内网机。通过查资料,docker镜像的导入导出命令有save,load,export,import;其中save保存的是镜像,load加载的是镜像包(不能对镜像重命名);export保存的是容器,import载入的是容器包,可以为镜像指定新名称。同时,export导出的文件再…

    2025年9月17日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号