1、定义一个二叉树的节点类,如下所示:
class Node {
constructor(data, left, right) {
this.data = data;
this.left = left;
this.right = right
}
show() {
console.log(this.data);
}
};
2、定义一个Tree类,并将root结点定义为null
class Tree{
constructor() {
this.root = null;
}
}
3、二叉树的插入操作
insert(data) {
var node = new Node(data,null,null);
if (!this.root) {
this.root = node;
return ;
}
var current = this.root;
var parent = null;
while (current) {
//parent 永远指向子树的根节点,current是子树根节点的子节点一个指针。
parent = current;
if (data < parent.data) {
current = current.left;
if (! current) {
parent.left = node;
return ;
}
} else if( data > parent.data){
current = current.right;
if (! current) {
parent.right = node;
}
} else {
return ;
}
}
}
首先定义一个node,将要插入的data赋值给node。定义一个parent永远指向子树的根节点。然后定义一个current指针,如果data <current.data,current = current.left。current指针每次移动douyao判断current是否为空。如果为空说明找到 了插入的位置,parent.left = node或者parent.right = node。current永远在parent的下一层。
4、二叉树的递归遍历
//前序遍历,传入的node是根节点
preOrder(node) {
if (node) {
node.show();
this.preOrder(node.left);
this.preOrder(node.right);
}
}
//中序遍历
middleOrder(node) {
if (node) {
this.middleOrder(node.left);
node.show();
this.middleOrder(node.right);
}
}
//后序遍历
laterOrder(node) {
if (node) {
this.laterOrder(node.left);
this.laterOrder(node.right)
node.show();
}
}
5、获取二叉树的最大值和最小值
//获取二叉树的最小值
getMin() {
var current = this.root;
while (current) {
if (! current.left) {
return current
}
current = current.left;
}
}
//获取二叉树的最大值
getMax() {
var current = this.root;
while (current) {
if (! current.right) {
return current
}
current = current.right;
}
}
获取最小值就是一直向左遍历二叉树的节点。判断current.left是否为空,如果为空的话说明current就是最小值,返回current,否则将current = current.left。继续循环。
获取最大值和获取最小值的方法差不多,就是一直遍历二叉树的右节点。
6、获取二叉树的高度
//获取二叉树的的高度
getDeep(node,deep) {
if (deep === undefined) {
deep = 0
}
if (node === null) {
return deep;
}
deep++;
var dleft = this.getDeep(node.left,deep);
var dright = this.getDeep(node.right,deep);
return Math.max(dleft,dright);
}
分别递归二叉树的左右节点,如果node === null,就返回deep,如果node !==null,deep就加一,然后继续查找node的左右节点。
最后返回左高度和右高度中较大的那个。
7、树查找
//树查找
getNode(data,node) {
if (node) {
if (data === node.data) {
return node;
}else if(data < node.data) {
return this.getNode(data,node.left);
} else {
return this.getNode(data,node.right);
}
} else {
return null;
}
}
总结
关于二叉树的基本操作,一般都是用一个current指针,如果满足某一个条件,就把current置为current.left或者current.right。继续循环。关于针对二叉树的具体的题目,下次再写。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情