树是一种非线性的数据结构, 以分层的方式存储数据。 树被用来存储具有层级关系的数据, 比如文件系统中的文件; 树还被用来存储有序列表。
优点:在二叉树上进行查找非常快(而在链表上查找则不是这样), 为二叉树添加或删除元素也非常快(而对数组执行添加或删除操作则不是这样)。
1 树的定义
树由一组以边连接的节点组成。 每个方框都是一个节点, 连接方框的线叫做边。
一棵树最上面的节点称为根节点, 如果一个节点下面连接多个节点, 那么该节点称为父节点, 它下面的节点称为子节点。 一个节点可以有 0 个、 1 个或多个子节点。 没有任何子节点的节点称为叶子节点。
二叉树是一种特殊的树, 它的子节点个数不超过两个。
沿着一组特定的边, 可以从一个节点走到另外一个与它不直接相连的节点。 从一个节点到另一个节点的这一组边称为路径, 在图中用虚线表示。 以某种特定顺序访问树中所有的节点称为树的遍历。
树可以分为几个层次, 根节点是第 0 层, 它的子节点是第 1 层, 子节点的子节点是第 2层, 以此类推。 树中任何一层的节点可以都看做是子树的根, 该子树包含根节点的子节点, 子节点的子节点等。 我们定义树的层数就是树的深度。
每个节点都有一个与之相关的值, 该值有时被称为键。
2 二叉树和二叉查找树
一个父节点的两个子节点分别称为左节点和右节点。二叉查找树是一种特殊的二叉树, 相对较小的值保存在左节点中, 较大的值保存在右节点中。
1 实现二叉查找树
//保存数据, 保存和其他节点的链接
function Node(data, left, right) {
this.data = data;
this.left = left;
this.right = right;
this.show = show;
}
//显示保存在节点中的数据。
function show() {
return this.data;
}
创建一个类, 用来表示二叉查找树(BST)。
类只包含一个数据成员: 一个表示二叉查找树根节点的 Node 对象。 该类的构造函数将根节点初始化为 null, 以此创建一个空节点。
BST 先要有一个 insert()
方法, 用来向树中加入新节点。
首先要创建一个 Node 对象, 将数据传入该对象保存。
其次检查 BST 是否有根节点, 如果没有, 那么这是棵新树, 该节点就是根节点, 这个方法到此也就完成了; 否则, 进入下一步。
如果待插入节点不是根节点, 那么就需要准备遍历 BST&#x