返回
二叉树:JavaScript中的数据结构实现
前端
2024-01-23 16:00:15
JavaScript 实现数据结构——二叉树
在计算机科学中,树是一种常见的数据结构,它可以用来组织和存储数据。二叉树是一种特殊的树,每个节点最多有两个子节点。
二叉树的基本概念
二叉树的基本概念包括:
- 节点: 二叉树中的每个元素称为节点。
- 根节点: 二叉树的第一个节点称为根节点。
- 左子节点: 每个节点的左子节点是该节点的第一个子节点。
- 右子节点: 每个节点的右子节点是该节点的第二个子节点。
- 父节点: 每个节点的父节点是该节点的父节点。
- 子节点: 每个节点的子节点是该节点的子节点。
- 兄弟节点: 具有相同父节点的两个节点是兄弟节点。
- 叶节点: 没有子节点的节点称为叶节点。
- 度: 每个节点的度是该节点的子节点数。
- 高度: 二叉树的高度是从根节点到最长叶子节点的路径长度。
- 深度: 二叉树的深度是从根节点到某个节点的路径长度。
二叉树的实现
JavaScript 中,我们可以使用对象来实现二叉树。每个节点可以表示为一个对象,该对象具有以下属性:
- 值: 节点的值。
- 左子节点: 节点的左子节点。
- 右子节点: 节点的右子节点。
以下是一个简单的 JavaScript 二叉树实现:
class Node {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
class BinaryTree {
constructor() {
this.root = null;
}
insert(value) {
const newNode = new Node(value);
if (this.root === null) {
this.root = newNode;
} else {
this._insert(newNode, this.root);
}
}
_insert(newNode, currentNode) {
if (newNode.value < currentNode.value) {
if (currentNode.left === null) {
currentNode.left = newNode;
} else {
this._insert(newNode, currentNode.left);
}
} else {
if (currentNode.right === null) {
currentNode.right = newNode;
} else {
this._insert(newNode, currentNode.right);
}
}
}
search(value) {
return this._search(value, this.root);
}
_search(value, currentNode) {
if (currentNode === null) {
return null;
}
if (value === currentNode.value) {
return currentNode;
} else if (value < currentNode.value) {
return this._search(value, currentNode.left);
} else {
return this._search(value, currentNode.right);
}
}
delete(value) {
this._delete(value, this.root);
}
_delete(value, currentNode) {
if (currentNode === null) {
return null;
}
if (value === currentNode.value) {
if (currentNode.left === null && currentNode.right === null) {
return null;
} else if (currentNode.left === null) {
return currentNode.right;
} else if (currentNode.right === null) {
return currentNode.left;
} else {
const successor = this._findSuccessor(currentNode);
currentNode.value = successor.value;
this._delete(successor.value, currentNode.right);
}
} else if (value < currentNode.value) {
currentNode.left = this._delete(value, currentNode.left);
} else {
currentNode.right = this._delete(value, currentNode.right);
}
return currentNode;
}
_findSuccessor(node) {
let current