这是我参与更文挑战的第25天,活动详情查看:更文挑战
什么是二叉树
二叉树:是每个结点最多有两个子树的树结构。一个是左侧子节点,一个是右侧子节点。
二叉搜索树(BST)是二叉树的一种,但是它只允许你在左侧节点存储(比父节点)小的值,在右侧节点存储(比父节点)大(或者等于)的值。
我们先从二叉搜索树开始学习:
二叉搜索树和链表一样,通过指针来表示节点之间的关系(术语称之为边)。而我们知道在双向链表中,每个节点包含两个指针,一个指向后一个节点,一个指向前一个节点。而树也是这样的,一个指向左侧子节点,一个指向右侧子节点。我们在树结构中将节点称为键,键是树相关的术语中对节点的称呼。
实现二叉树需要的方法
- insert(key): 向树中插入一个新的键。
- search(key): 在树中查找一个键,如果节点存在返回true,如果不存在则返回false。
- inOrderTraverse: 通过中序遍历方式遍历所有节点。
- preOrderTraverse: 通过先序遍历方式遍历所有节点。
- postOrderTraverse: 通过后序遍历方式遍历所有节点。
- min: 返回树中最小的值/键。
- max: 返回树中最大的值/键。
- remove(key): 从树中移除某个键。
实现二叉树
首先创建 BinarySearchTree
类。
function BinarySearchTree () {
// 初始化根节点为null
let root = null
// 声明节点Node类,用于创建多个独立的节点
let Node = function (key) {
this.key = key
this.left = null
this.right = null
}
// 下面是methods
this.insert = function (key) {
// 首先根据传入的键生成节点node
let newNode = new Node(key)
// 插入之前判断当前树中是否有根节点
if (!root) {
root = node
} else {
// 根节点存在则判断插入逻辑,需要辅助函数 insertNode
insertNode(root, newNode)
}
}
// 插入逻辑实际上就是判断要插入的子节点和父节点之间的大小,从而决定是该放在左边还是右边
let insertNode = functicon (node, newNode) {
// 左侧节点只能存放比父节点小的值
if(newNode.key < node.key) {
// 当前节点的左侧节点为空则可以插入,否则递归调用 insertNode
!node.left ? node.left = newNode : insertNode(node.left, newNode)
} else {
// 当前节点的右侧节点只能存放大于等于父节点的值
!node.right ? node.right = newNode : insertNode(node.right, newNode)
}
}
}
未完待续。。。