javascript实现二叉树基本操作

一、定义

二叉树:在计算机科学中,二叉树是每个节点最多有两个子树的树结构。

二、模拟

  • 定义我们的二叉树
  • 节点,保存值,并有一个 show 方法
1
2
3
4
5
function Node(data, left, right) {
this.data = data;
this.left = left;
this.right = right;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function BST(){
this.root = null;
this.insert = insert;
}
// 插入新节点
function insert(data){
var n = new Node(data, null, null);
if(this.root = null){
// 第一次初始化根节点
this.root = n;
}else{
var current = this.root;
var parent;
while(true){
parent = current;
// 小于节点插入左子树,否则插入右子树
if(data < current.data){
current = current.left;
if(currnet === null){
parent.left = n;
break
}
}else{
current = current.right;
if(current === null){
parent.right = n;
break
}
}
}
}
}
  • 说到二叉树,肯定想到了前序,中序,后序,层序遍历,现在模拟一下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
function order(type){
var str = '';
// 先序遍历
function preOrder(node){
if(node !== null){
str += node.data + ' ';
preOrder(node.left);
preOrder(node.right);
}
}
// 中序遍历
function inOrder(node) {
if(!(node == null)) {
inOrder(node.left);
str += node.data + ' ';
inOrder(node.right);
}
}
// 后续遍历
function lastOrder(node){
if(!(node == null)){
lastOrder(node.left);
lastOrder(node.right);
str += node.data + ' ';
}
}
// 层序遍历(广度优先遍历)
function levelOrder(node){
var res = [];
res.push(node);
while(res.length){
if(res[0].left !== null){
res.push(res[0].left);
}
if(res[0].right !== null){
res.push(res[0].right);
}
str += res.shift().data + ' ';
}
}
if(type === 'preOrder'){
preOrder(this.root);
}else if(type === 'inOrder'){
inOrder(this.root);
}else if(type === 'lastOrder'){
lastOrder(this.root);
}else if(type === 'levelOrder'){
levelOrder(this.root);
}
console.log(str);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 求树的高度
function height(){
var node = this.root;
var res = [];
function _hei(n, hei){
if(n.left !== null){
_hei(n.left, hei + 1)
}else{
res.push(hei)
}
if(n.right !== null){
_hei(n.right, hei + 1)
}else{
res.push(hei)
}
}
_hei(node, 1);
console.log(Math.max(...res));
}
  • 测试一下所有写的算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var nums = new BST();
nums.insert(23);
nums.insert(45);
nums.insert(16);
nums.insert(37);
nums.insert(3);
nums.insert(99);
nums.insert(22);
nums.insert(22);
console.log('先序遍历:');
nums.order('preOrder');
console.log('中序遍历:');
nums.order('inOrder');
console.log('后序遍历:');
nums.order('lastOrder');
console.log('层序遍历:');
nums.order('levelOrder');
console.log('树的高度:');
nums.height();
  • 结果
    https://raw.githubusercontent.com/lastnigtic/presentationPIC/master/erchatree/0.png