简单说说二叉树。
那么我要说的二叉树是什么呢?它是一种数据结构,数据结构是什么可以自行百度一下,这里不讨论他。举一个现实中的例子:把某个家庭看作一棵树,这家的爸爸(妈妈)有两个孩子,那么 爸爸(妈妈) 就是树的根,俩孩子就是这棵树的叶子,而此时这种,孩子只有唯一父辈(爸爸妈妈看作一个整体),父辈或者没有孩子,或者有且最多有两个孩子的树就叫做二叉树,可以参考下图
有么有很简单,5行搞定,相信你已经理解了。
那么还有一个问题,我用这段遍历代码去遍历谁?遍历二叉树啊!那么二叉树从何而来,这就涉及到二叉树的节点定义,和二叉树的创建了。好,一起来看一下:
4.定义二叉树的节点
首先二叉树每个节点得有一个存储信息的变量,其次它得有左右子树的指针指向,那么就是下面这样了
5.二叉树的创建:
如果你理解了上面的先序遍历算法,那么创建也就很简单了,我们先输入一个字符,如果是空节点标志符,就相当于上一个插入的是根节点或是叶子节点了,这个节点就是空了,否则,插入这个信息,递归创建左右子树。看一下代码:
上面的代码是我从控制台输入数据,测试的时候用的,如果你是文件输入或者其他方式,相应做修改就行。
那么我要说的二叉树是什么呢?它是一种数据结构,数据结构是什么可以自行百度一下,这里不讨论他。举一个现实中的例子:把某个家庭看作一棵树,这家的爸爸(妈妈)有两个孩子,那么 爸爸(妈妈) 就是树的根,俩孩子就是这棵树的叶子,而此时这种,孩子只有唯一父辈(爸爸妈妈看作一个整体),父辈或者没有孩子,或者有且最多有两个孩子的树就叫做二叉树,可以参考下图
就这样这个家族子子辈辈形成一个越来越高的二叉树。( 注意看它是倒过来的)
那么这个时候故事来了:有一家的的家谱非常奇特,它从第一页开始,翻阅者每次只能看到家谱的一页,这一页上记录着一个人的信息和他两个孩子在哪一页的指示页码,通过指示页码可以找到这两个孩子的信息存放页。不知道你有没有想象出来这个家谱的样子。大概是下面这个样子:
后面还有很多很多这样的书页。。。
然后有一个不知道是第几十辈孙子突发奇想,他想看看这本家谱上到底有多少先人,自己又是怎么来的。但是你知道在只有一个始祖页面的情况下, 一个不漏的找出所有人,会有多少种路径够你找,还不一定能找全。。。。看似很难的样子,该怎么办?
然而,很巧的是这个孩子很勤奋,他学习过一种叫做二叉树的数据结构,还研究过它的遍历算法,直白点,就是把每一个点都访问一次。在这个21世纪互联网快速发展,计算机极度普及 的年代,他只写了一段代码就搞定了,同时还用了三种方法,这个孩子很厉害啊,后生可畏!!!
故事结束
好了现在来看看二叉树的 三种 遍历算法(挺简单的,直接上代码) :
那么这个时候故事来了:有一家的的家谱非常奇特,它从第一页开始,翻阅者每次只能看到家谱的一页,这一页上记录着一个人的信息和他两个孩子在哪一页的指示页码,通过指示页码可以找到这两个孩子的信息存放页。不知道你有没有想象出来这个家谱的样子。大概是下面这个样子:
后面还有很多很多这样的书页。。。
然后有一个不知道是第几十辈孙子突发奇想,他想看看这本家谱上到底有多少先人,自己又是怎么来的。但是你知道在只有一个始祖页面的情况下, 一个不漏的找出所有人,会有多少种路径够你找,还不一定能找全。。。。看似很难的样子,该怎么办?
然而,很巧的是这个孩子很勤奋,他学习过一种叫做二叉树的数据结构,还研究过它的遍历算法,直白点,就是把每一个点都访问一次。在这个21世纪互联网快速发展,计算机极度普及 的年代,他只写了一段代码就搞定了,同时还用了三种方法,这个孩子很厉害啊,后生可畏!!!
故事结束
好了现在来看看二叉树的 三种 遍历算法(挺简单的,直接上代码) :
因为根节点的左右子节点下面又是一棵二叉树,所以遍历就只考虑根、左、右三个节点的访问,访问就是看他在不在,即 if(p !=null),在,就输出他的信息,接着对左右子树使用相同的方法遍历即可。遍历没有返回值。(详见代码)
1.先序遍历
保证每个节点访问一次
2.中序遍历
3.后序遍历
1.先序遍历
保证每个节点访问一次
2.中序遍历
3.后序遍历
有么有很简单,5行搞定,相信你已经理解了。
那么还有一个问题,我用这段遍历代码去遍历谁?遍历二叉树啊!那么二叉树从何而来,这就涉及到二叉树的节点定义,和二叉树的创建了。好,一起来看一下:
4.定义二叉树的节点
首先二叉树每个节点得有一个存储信息的变量,其次它得有左右子树的指针指向,那么就是下面这样了
5.二叉树的创建:
如果你理解了上面的先序遍历算法,那么创建也就很简单了,我们先输入一个字符,如果是空节点标志符,就相当于上一个插入的是根节点或是叶子节点了,这个节点就是空了,否则,插入这个信息,递归创建左右子树。看一下代码:
上面的代码是我从控制台输入数据,测试的时候用的,如果你是文件输入或者其他方式,相应做修改就行。