javascript中的数据结构与算法(六)--二叉树
2017-09-26 本文已影响0人
dravenxiaokai
二叉树和二叉搜索树
ps:整个文章所涉及的源代码我都发布在我的Github主页上,大家可以自行下载,如果对您有一丢丢的帮助的话,记得在我的github项目上点上【star】哟,当然不要忘了在本篇文章下方【点赞】啦,你们的支持将是我最大的动力!
(利他之心是每个优秀开发者的传统美德!——@惜墨的少年)
树的相关术语
一个树结构包含一系列存在父子关系的节点。除了顶部的第一个节点,每个节点都有一个父节点以及零个或多个子节点。树顶部的节点叫做根节点,它没有父节点。树中每个元素叫做节点,节点分为内部节点和外部节点。至少有一个子节点的节点称为内部节点。没有子元素的节点称为外部节点即叶子节点。
有关树的另外一个术语是子树。子树由节点和它的后代构成。节点的一个属性是深度,节点的深度取决于它的祖先节点的数量。树的高度取决于所有节点深度的最大值。一棵树也可以分解成层级。根节点在第0层,它的子节点在第1层,以此类推。
二叉树和二叉搜索树
二叉树中的节点最多只能有两个子节点:一个是左侧子节点,另一个是右侧子节点。二叉搜索树(BST)是二叉树的一种,但是只允许在左侧节点存储(比父节点)小的值,在右侧节点存储(比父节点)大(或者等于)的值。下面以二叉搜索树为例。
创建 Node 类
![](https://img.haomeiwen.com/i7425269/f2e522953a77fee4.png)
创建 BinarySearchTree 类
![](https://img.haomeiwen.com/i7425269/add98b9695f1a690.png)
![](https://img.haomeiwen.com/i7425269/4dd48fd423a6d834.png)
![](https://img.haomeiwen.com/i7425269/b9acf7460102e691.png)
中序遍历
中序遍历是一种以上行顺序访问BST所有节点的遍历方式,也就是以从小到大的顺序访问所有节点。中序遍历的一种应用是对树进行排序操作。
![](https://img.haomeiwen.com/i7425269/db66ab382fdbd2cc.png)
先序遍历
先序遍历是以优先于后代节点的顺序访问每个节点的。先序遍历的一种应用是打印一个结构化的文档。
![](https://img.haomeiwen.com/i7425269/1db02a8a63dd497c.png)
后序遍历
后序遍历是先访问节点的后代节点,再访问节点本身。后续遍历的一种应用是计算一个目录和它的子目录中所有文件所占空间大小。
![](https://img.haomeiwen.com/i7425269/4a5c71bc61b547b3.png)
![](https://img.haomeiwen.com/i7425269/c4ce294596309c00.png)
![](https://img.haomeiwen.com/i7425269/d30a40dd3eecef62.png)
![](https://img.haomeiwen.com/i7425269/55761d5ed89612d7.png)
搜索树中的值
(1)最小值
![](https://img.haomeiwen.com/i7425269/a5a82cdfbb932440.png)
(2)最大值
![](https://img.haomeiwen.com/i7425269/6ce91276bcf03d33.png)
(3)搜索特定的值
![](https://img.haomeiwen.com/i7425269/8b00e08a0b4bf0b1.png)
![](https://img.haomeiwen.com/i7425269/a4a9d5ebfc691a04.png)
![](https://img.haomeiwen.com/i7425269/91cb5c8a7abc32c9.png)
移除一个节点
(1)移除一个叶子结点
(2)移除有一个左或右子节点的节点
(3)移除有两个子节点的节点
![](https://img.haomeiwen.com/i7425269/758fd4fde565b6a8.png)
![](https://img.haomeiwen.com/i7425269/cd657656acd017bd.png)
![](https://img.haomeiwen.com/i7425269/a84a7eaa5d06507e.png)
![](https://img.haomeiwen.com/i7425269/5eeb92064191874d.png)