绪论
树的特点: 多层非线性数据结构。进行插入或搜索时很快。
树的方法:
- add:向树中插入一个节点。
- findMin:查找树中最小的节点。
- findMax:查找树中最大的节点。
- find:查找树中某个节点。
- isPresent:判断树中是否存在某个节点。
- remove:移除树中的某个节点。
正文
<!DOCTYPE html>
<div lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>index</title>
<script src="js/jquery-2.2.4.min.js"></script>
<style>
</style>
</head>
<body>
</body>
<script>
$(document).ready(function () {
var tree = new MyTree();
tree.add(9);
tree.add(4);
tree.add(15);
tree.add(2);
tree.add(3);
tree.add(1);
tree.add(6);
tree.add(5);
tree.add(8);
tree.add(7);
tree.add(17);
tree.add(10);
tree.add(11);
tree.show();
console.log('最小值' + tree.findMin());
console.log('最大值' + tree.findMax());
console.log('8是否存在' + tree.isPresent(8));
tree.remove(1);
console.log('最小值' + tree.findMin());
tree.remove(9);
console.log('9是否存在' + tree.isPresent(9));
tree.show();
});
// 树的节点信息
function Node(data, left = null, right = null) {
this.data = data;
this.left = left;
this.right = right;
}
function MyTree() {
// 根节点
this.root = null;
// 向树中插入一个节点
this.add = function(v) {
if (v === null || v === undefined) {
return false;
}
var node = this.root;
// 判断根节点是否有值
if (node === null) {
this.root = new Node(v);
return true;
} else {
var searchTree = function(n) {
// 与根节点进行比较
if (v < n.data) {
if (n.left === null) {
n.left = new Node(v);
return true;
} else {
return searchTree(n.left);
}
} else if (v > n.data) {
if (n.right === null) {
n.right = new Node(v);
return true;
} else {
return searchTree(n.right);
}
} else {
return false;
}
};
return searchTree(node);
}
};
// 查找树中最小的节点
this.findMin = function() {
var node = this.root;
while(node.left !== null) {
node = node.left;
}
return node.data;
};
// 查找树中最大的节点
this.findMax = function() {
var node = this.root;
while(node.right !== null) {
node = node.right;
}
return node.data;
};
// 查找树中某个节点
this.find = function(v) {
var node = this.root;
while (node.data !== v) {
if (v < node.data) {
node = node.left;
} else {
node = node.right;
}
if (node === null) {
return null;
}
}
return node;
};
// 判断树中是否存在某个节点
this.isPresent = function(v) {
var node = this.root;
while (node !== null) {
if (node.data === v) {
return true;
}
if (v < node.data) {
node = node.left;
} else {
node = node.right;
}
}
return false;
};
// 移除树中的某个节点
this.remove = function(v) {
var removeNode = function(n, v) {
if (n === null) {
return null;
}
if (v === n.data) {
// 没有子节点
if (n.left === null && n.right === null) {
return null;
}
// 没有左侧子节点
if (n.left === null) {
return n.right;
}
// 没有右侧子节点
if (n.right === null) {
return n.left;
}
// 有两个子节点,像删除根节点一样,去右侧树中找最小值,把这个最小值当成根节点,
// 再次调用删除方法,把刚获取的最小值在右侧树中删除掉
var tempNode = n.right;
while (tempNode.left !== null) {
tempNode = tempNode.left;
}
n.data = tempNode.data;
n.right = removeNode(n.right, tempNode.data);
return n;
} else if (v < n.data) {
n.left = removeNode(n.left, v);
return n;
} else {
n.right = removeNode(n.right, v);
return n;
}
};
this.root = removeNode(this.root, v);
};
// 展示
this.show = function() {
var arr = [];
var myShow = function(n) {
if (n !== null) {
arr.push(n.data);
if (n.left !== null) {
myShow(n.left);
}
if (n.right !== null) {
myShow(n.right);
}
}
};
myShow(this.root);
console.log(arr.join(' -> '));
};
}
</script>
</div>
结果
(若有什么错误,请留言指正,3Q)