function TreeNode(data, left, right) {
this.data = data;
this.left = left || null;
this.right = right || null;
}
function BinarySearchTree(rootNode) {
this.rootNode = rootNode || null;
}
BinarySearchTree.prototype = {
insert: function (data) {
var newNode = new TreeNode(data);
if (!this.rootNode) {
this.rootNode = newNode;
return;
}
var currentNode = this.rootNode;
var parent = null;
while (true) {
parent = currentNode;
if (data < currentNode.data) {
currentNode = currentNode.left;
if (!currentNode) {
parent.left = newNode;
return;
}
} else if (data > currentNode.data) {
currentNode = currentNode.right;
if (!currentNode) {
parent.right = newNode;
return;
}
} else {
console.log("该节点已存在");
return;
}
}
},
find: function (data) {
if (!this.rootNode) {
return;
}
var currentNode = this.rootNode;
while (true) {
if (!currentNode) {
console.log("该节点不存在");
return;
}
if (data < currentNode.data) {
currentNode = currentNode.left;
} else if (data > currentNode.data) {
currentNode = currentNode.right;
} else {
return currentNode;
}
}
},
removeNode: function (data) {
if (!this.rootNode) {
return;
}
var parent = null;
var currentNode = this.rootNode;
var place = null;
while (true) {
if (!currentNode) {
console.log("该节点不存在");
return;
}
if (data < currentNode.data) {
parent = currentNode;
currentNode = currentNode.left;
place = "left";
} else if (data > currentNode.data) {
parent = currentNode;
currentNode = currentNode.right;
place = "right";
} else {
break;
}
}
if (!currentNode.left) {
parent[place] = currentNode.right || null;
} else if (!currentNode.right) {
parent[place] = currentNode.left || null;
} else {
var replaceNode = currentNode.left;
var replaceNodeParent = null;
while (replaceNode.right) {
replaceNodeParent = replaceNode;
replaceNode = replaceNode.right;
}
parent[place] = replaceNode;
if (replaceNodeParent) {
replaceNodeParent.right = replaceNode.left || null;
parent[place].left = currentNode.left;
}
parent[place].right = currentNode.right;
}
return;
},
preOrder: function (curNode) {
if (curNode !== null) {
console.log(curNode.data);
this.preOrder(curNode.left);
this.preOrder(curNode.right);
}
},
inOrder: function (curNode) //三种遍历的差别是打印结点Key的语句的位置不同
{
if (curNode !== null) {
this.inOrder(curNode.left);
console.log(curNode.data);
this.inOrder(curNode.right);
}
},
postOrder: function (curNode) {
if (curNode !== null) {
this.postOrder(curNode.left);
this.postOrder(curNode.right);
console.log(curNode.data);
}
},
customOrder: function (curNode) {
if (curNode !== null) {
let result = [];
let queue = [];
queue.push(curNode);
let pointer = 0;
while (pointer < queue.length) {
let curNode = queue[pointer++]
result.push(curNode.data);
console.log("current:"+curNode.data)
if (curNode.left) {
console.log("left:" + curNode.left.data)
queue.push(curNode.left)
}
if (curNode.right) {
console.log("right:" + curNode.right.data)
queue.push(curNode.right)
}
}
console.log(result)
return result;
}
}
}
function printTree(tree) {
tree.customOrder(tree.rootNode)
}
var arr = [9, 8, 5, 0, 1, 6, 2]
console.log(arr)
var tree = new BinarySearchTree();
arr.map((item) => {
tree.insert(item)
})
console.log(tree)
printTree(tree)
let result = [];
let stack = [tree.rootNode];
let count = 0;
let bfs = function () {
let node = stack[count];
if (node) {
result.push(node.data);
if (node.left) stack.push(node.left);
if (node.right) stack.push(node.right);
count++;
bfs();
}
}
bfs();
console.log(result)
console