Go语言实现二叉树遍历

Python019

Go语言实现二叉树遍历,第1张

图例如下:

结果应该是分别是:

广度优先: a ->b ->c ->d ->f ->e ->g

先序遍历: a ->b ->d ->e ->f ->g ->c

中序遍历: e ->d ->b ->g ->f ->a ->c

后序遍历: e ->d ->g ->f ->b ->c ->a

结果存在result里面,如果不存可以少一层变量

这个地方强烈建议读一下下面的第一个链接,我遵照着那篇文章实现的,只是用Go改写了而已。

首先定义一个数据结构,用来存储一些Node的信息。

这里是可以运行的,但是总会抛出一个数组越界的错误,我看了半天也没看出来哪里有问题,Mac版的devel我这边又有bug,没用起来。至少思路对了,我后面再看一下哪里的问题。(感谢 @RiXu 指正)

如果文字表达的话就是下面的,若看不懂,可以在百度的图片搜索里输入二叉树找张图对照着比划下,应该能看懂。概念并不是很难。

说简单点就是一个点分两个叉,这两个叉又分别分两个叉(搜张图就明白这句了)。~~~~~

树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示。树在计算机领域中也得到广泛应用,如在编译源程序如下时,可用树表示源源程序如下的语法结构。又如在数据库系统中,树型结构也是信息的重要组织形式之一。一切具有层次关系的问题都可用树来描述。

一、树的概述

树结构的特点是:它的每一个结点都可以有不止一个直接后继,除根结点外的所有结点都有且只有一个直接前趋。以下具体地给出树的定义及树的数据结构表示。

(一)树的定义

树是由一个或多个结点组成的有限集合,其中:

⒈必有一个特定的称为根(ROOT)的结点;

⒉剩下的结点被分成n>=0个互不相交的集合T1、T2、......Tn,而且, 这些集合的每一个又都是树。树T1、T2、......Tn被称作根的子树(Subtree)。

树的递归定义如下:(1)至少有一个结点(称为根)(2)其它是互不相交的子树

5. 2 二叉树

1.二叉树的基本形态:

二叉树也是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态:

(1)空二叉树——(a);

(2)只有一个根结点的二叉树——(b);

(3)右子树为空的二叉树——(c);

(4)左子树为空的二叉树——(d);

(5)完全二叉树——(e)

注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。

2.两个重要的概念:

(1)完全二叉树——只有最下面的两层结点度小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树;

(2)满二叉树——除了叶结点外每一个结点都有左右子女且叶结点都处在最底层的二叉树,。

5.普通树转换成二叉树:凡是兄弟就用线连起来,然后去掉父亲到儿子的连线,只留下父母到其第一个子女的连线。

二叉树很象一株倒悬着的树,从树根到大分枝、小分枝、直到叶子把数据联系起来,这种数据结构就叫做树结构,简称树。树中每个分叉点称为结点,起始结点称为树根,任意两个结点间的连接关系称为树枝,结点下面不再有分枝称为树叶。结点的前趋结点称为该结点的"双亲",结点的后趋结点称为该结点的"子女"或"孩子",同一结点的"子女"之间互称"兄弟"。

二叉树:二叉树是一种十分重要的树型结构。它的特点是,树中的每个结点最多只有两棵子树,即树中任何结点的度数不得大于2。二叉树的子树有左右之分,而且,子树的左右次序是重要的,即使在只有一棵子树的情况下,也应分清是左子树还是右子树。定义:二叉树是结点的有限集合,这个集合或是空的,或是由一个根结点和两棵互不相交的称之为左子树和右子树的二叉树组成。

(三)完全二叉树

对满二叉树,从第一层的结点(即根)开始,由下而上,由左及右,按顺序结点编号,便得到满二叉树的一个顺序表示。据此编号,完全二叉树定义如下:一棵具有n个结点,深度为K的二叉树,当且仅当所有结点对应于深度为K的满二叉树中编号由1至n的那些结点时,该二叉树便是完全二叉树。图4是一棵完全二叉树。

从收到飞书的面试通知的兴奋期待,到收到面试失败的沮丧,短短一周而已。

刚收到hr的面试通知时,内心挺激动的,终于摸到大厂的门槛了。多少年过去了,一直在小厂里挣扎,没感受过大厂的光环。于是开始了短暂的面试准备。

首先,去网上搜一下面试经历,初步看了下面试过程和问题,了解面试难度和范围。发现他们家面试对算法尤为看重,然后了解到面试的难度不小,会问得很深。然后,找了一些更全面的面试准备材料。

接下来开始正式准备,分为三个方向,一是加强算法练习,二是技术面问题准备,三是对项目进行梳理。每天晚上下班之后,固定到leetcode上刷一道算法题。每天空余时间,都看下常见面试问题集合,进行技术复习。上班的路上回想自己做过的项目,梳理项目的技术点、难点、背景,深入挖掘项目的价值。

就这样过了一周的时间,到了要赶鸭子上架的时候。面试时间约了晚上8点,我7点从公司走路回宿舍,花了40分钟终于赶到。没吃上一口饭,马上打开电脑,准备好面试环境,还剩8分钟,面试官还没上线。我去拿了一瓶牛奶将就对付一下肚子。

8点一到,面试官准时上线,是个年轻的小伙子,没有秃头,也没有白头发。一看就是技术宅的那种。进入面试环境,老套路,先自我介绍。这部分我之前有稍微准备了一点,避免一上场就脑袋空白。介绍了教育、工作、项目、技术方面的内容。然后面试官开始问题问题了。

问题一:介绍项目中如何做接口优化的。这块我印象比较深刻,所以回答的思路比较清晰。

问题二:使用缓存有哪些问题?说了缓存一致性和缓存穿透问题,并给出了解决方案。

问题三:缓存写满了,这时如何处理。给了好几种解决方案,并讲解了优缺点。

问题四:秒杀场景下,写缓存失败如何处理。这个当时回答有误,和面试官讨论之后,改正了思路。

问题五:对于HTTP和HTTPS的认识。谈了HTTP的发展过程,以及HTTPS和HTTP的区别。

问题六:HTTPS如何做到安全,讲了大体思路,在描述TLS加密时卡壳了,这块了解地不深。

问题七:开始算法了,求解二叉树两个节点的最近祖先。给了求解思路,探讨了时间复时间度和空间复杂度。

然后面试结束了,问我的意愿,我说我想做网络方面的业务,想做java大方向。面试官说他们用的语言是GO,然后我知道要凉了。

过了两天,果不其然,收到面试失败的通知。

这次面试给我的感觉其实不错的,有点可惜,还是没有迈进大厂。不过这次面试,让我学到了一些东西。技术是需要时间沉淀的,项目一定要重视,面试一定会通过项目了解个人的思维、技术、性格等等方面。大处着眼,小处着手,切忌眼高手低。

好了,最后自我安慰下,不忘初心,方得始终。