-
排序二叉樹查看全部
-
斷點調(diào)試,單步調(diào)試查看全部
-
排序二叉樹:左孩子 <父節(jié)點< 右孩子? 兄弟節(jié)點? ?根節(jié)點
查看全部 -
源代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
</body>
<script type="text/javascript">
function BinaryTree () {
var Node = function (key) {
this.key = key;
this.left = null;
this.right = null;
}
this.root = null;
var insertNode = function (node,newNode) {
if(newNode.key < node.key){
if(node.left === null){
node.left = newNode;
}else{
insertNode(node.left,newNode);
}
}else if(newNode.key > node.key){
if(node.right === null){
node.right = newNode;
}else{
insertNode(node.right,newNode);
}
}
}
this.insert = function (key) {
if(this.root === null){
this.root = new Node(key);
}else{
insertNode(this.root,new Node(key));
}
}
//棧是先進后出的,所以在節(jié)點1的時候,它沒有左子節(jié)點,這個時候開始出棧,繼續(xù)執(zhí)行上一次的inOrderTraverceNodes里未執(zhí)行完的代碼,當節(jié)點1也沒有右子節(jié)點的時候,到節(jié)點3開始繼續(xù)執(zhí)行上一次的inOrderTraverceNodes里未執(zhí)行完的代碼,以此類推。
//棧是先進后出的,一開始節(jié)點8執(zhí)行函數(shù),有左子節(jié)點3,節(jié)點3執(zhí)行函數(shù),有左子節(jié)點1,節(jié)點1執(zhí)行函數(shù),沒有左子節(jié)點,這時是null,這時這個函數(shù)已經(jīng)出棧,到節(jié)點1之前執(zhí)行的函數(shù)開始出棧了,然后調(diào)用callback,打印了1,然后節(jié)點1傳入node.right,這時又是null,然后這個函數(shù)出棧了,開始到節(jié)點3之前執(zhí)行的函數(shù)出棧了,所以進棧的順序是8,3,1,1的左null,出棧的順序是1的左null,1,1的右null,3,3執(zhí)行后,右邊有個6,6進棧,6有4,4進棧,這個時候棧里還有8,3,,6,4
//中序遍歷代碼,先找左子節(jié)點,再找右子節(jié)點
var inOrderTraverceNodes = function (node,callback) {
if(node !== null){
inOrderTraverceNodes(node.left,callback);
callback(node.key);//調(diào)動callback
inOrderTraverceNodes(node.right,callback);
}
}
this.inOrderTraverce = function (callback) {
inOrderTraverceNodes(this.root,callback);
}
//前序遍歷代碼,先找自己,再找左子節(jié)點,再找右子節(jié)點
var preOrderTraverceNodes = function (node,callback) {
if(node !== null){
callback(node.key);//調(diào)動callback
preOrderTraverceNodes(node.left,callback);
preOrderTraverceNodes(node.right,callback);
}
}
this.preOrderTraverce = function (callback) {
preOrderTraverceNodes(this.root,callback);
}
//后序遍歷代碼,先找左子節(jié)點,再找右子節(jié)點,需要找完自己的左右子節(jié)點
var postOrderTraverceNodes = function (node,callback) {
if(node !== null){
postOrderTraverceNodes(node.left,callback);
postOrderTraverceNodes(node.right,callback);
callback(node.key);//調(diào)動callback
}
}
this.postOrderTraverce = function (callback) {
preOrderTraverceNodes(this.root,callback);
}
//查找最小值,只需要查找左子節(jié)點
var minNode = function (node) {
if(node){
while (node && node.left !== null) {
node = node.left;
}
return node.key;
}
return null;
}
this.min = function () {
return minNode(this.root);
}
//查找最大值,只需要查找右子節(jié)點
var maxNode = function (node) {
if(node){
while (node && node.right !== null) {
node = node.right;
}
return node.key;
}
return null;
}
this.max = function () {
return minNode(this.root);
}
//查找值x
var searchNode = function (node,key) {
if(node === null){
return false;
}
if(key < node.key){
return searchNode(node.left,key);
}else if(key > node.key){
return searchNode(node.right,key);
}else{
return true;
}
}
this.search = function (key) {
return searchNode(this.root,key);
}
//查找最小值,只需要查找左子節(jié)點
var findMinNode = function (node) {
if(node){
while (node && node.left !== null) {
node = node.left;
}
return node;
}
return null;
}
//刪除葉子節(jié)點
var removeNode = function (node,key) {
if(node === null){
return null;
}
if(key < node.key){
node.left = removeNode(node.left,key);
return node;
}else if(key > node.key){
node.right = removeNode(node.right,key);
return node;
}else{
if(node.left === null && node.right === null){
node = null;
return node;
}
if(node.left === null){
//把右子節(jié)點覆蓋當前節(jié)點
node = node.right;
return node;
}else if(node.right === null){
//把右子節(jié)點覆蓋當前節(jié)點
node = node.left;
return node;
}else{
//例如刪除的是節(jié)點3,走到這里當前節(jié)點就是節(jié)點3了,傳入節(jié)點6,找到它的最小節(jié)點,返回當前節(jié)點,修改節(jié)點3的key為節(jié)點4,傳入節(jié)點6和要刪除的節(jié)點4,刪除后重新對節(jié)點6賦值,在返回其父節(jié)點4
var aux = findMinNode(node.right);
node.key = aux.key;
node.right = removeNode(node.right,aux.key);
return node;
}
}
}
this.remove = function (key) {
removeNode(this.root,key);
}
}
var nodes = [8,3,10,1,6,14,4,7,13];
var binaryTree = new BinaryTree;
nodes.forEach((key) =>{
binaryTree.insert(key);
})
console.dir(binaryTree.root);
var callback = function (key) {
console.log(key);
}
// binaryTree.preOrderTraverce(callback);
// console.log('this is min: ' + binaryTree.min());
console.log('this is search: ' + binaryTree.search(7));
console.log('this is search: ' + binaryTree.search(9));
binaryTree.remove(1);
</script>
</html>
查看全部 -
? var inOrderTraverseNode = function (node,callback){
? ? ? ? ? if(node!==null){
? ? ? ? ? ? inOrderTraverseNode(node.left,callback);
? ? ? ? ? ? callback(node.key);
? ? ? ? ? ? inOrderTraverseNode(node.right,callback);
? ? ? ? ? }
? ? ? ? }
? ? ? ? this.inOrderTraverse = function(callback){
? ? ? ? ? inOrderTraverseNode(root,callback);
? ? ? ? }
? ? };
? ? var nodes=[8,3,1,6,14,4,7,13];
? ? var binaryTree=new BinaryTree();
? ? nodes.forEach(function(key){
? ? ? ? binaryTree.insert(key);
? ? });
? ? var callback=function(key){
? ? ? console.log(key);
? ? }
? ? binaryTree.inOrderTraverse(callback);
查看全部 -
function(callback){
}
當我們要輸出某一個節(jié)點的值得時候,我們就把這個節(jié)點的值傳入這個回調(diào)函數(shù)中,讓這個回調(diào)函數(shù)決定怎么輸出出來
查看全部 -
==用于一般比較,===用于嚴格比較,==在比較的時候可以轉(zhuǎn)換數(shù)據(jù)類型,===嚴格比較,只要類型不匹配就返回flase
查看全部 -
“==”是"==="
var nodes=[8,3,1];
查看全部 -
Node.js
開發(fā)的APP可以在IOS和Android平臺上同時運行
console.log("Hello World");
在開發(fā)者工具中顯示
單步調(diào)試
查看全部 -
編程入門查看全部
-
后序遍歷---先遍歷左節(jié)點,然后遍歷右節(jié)點,最后打印當前父節(jié)點
查看全部 -
前序遍歷---相當于復(fù)制當前的二叉樹
查看全部 -
中序遍歷---先找左節(jié)點,然后父節(jié)點,最后右節(jié)點
查看全部 -
public?static?final?String?node=?"xxxxx"; //二叉樹前序遍歷復(fù)制數(shù)據(jù)最快
查看全部 -
document.querySelector查看全部
舉報