class Node {
constructor(data, left, right) {
this.data = data;
this.left = left;
this.right = right
}
show() {
console.log(this.data);
}
};
複製代碼
class Tree{
constructor() {
this.root = null;
}
}
複製代碼
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的下一層。javascript
//前序遍歷,傳入的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();
}
}
複製代碼
//獲取二叉樹的最小值
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。繼續循環。java
獲取最大值和獲取最小值的方法差很少,就是一直遍歷二叉樹的右節點。node
//獲取二叉樹的的高度
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的左右節點。markdown
最後返回左高度和右高度中較大的那個。oop
//樹查找
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。繼續循環。關於針對二叉樹的具體的題目,下次再寫。ui
本文正在參與「掘金 2021 春招闖關活動」, 點擊查看 活動詳情this