-
排序二叉樹查看全部
-
斷點調試,單步調試查看全部
-
排序二叉樹:左孩子 <父節點< 右孩子? 兄弟節點? ?根節點
查看全部 -
源代碼:
<!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));
}
}
//棧是先進后出的,所以在節點1的時候,它沒有左子節點,這個時候開始出棧,繼續執行上一次的inOrderTraverceNodes里未執行完的代碼,當節點1也沒有右子節點的時候,到節點3開始繼續執行上一次的inOrderTraverceNodes里未執行完的代碼,以此類推。
//棧是先進后出的,一開始節點8執行函數,有左子節點3,節點3執行函數,有左子節點1,節點1執行函數,沒有左子節點,這時是null,這時這個函數已經出棧,到節點1之前執行的函數開始出棧了,然后調用callback,打印了1,然后節點1傳入node.right,這時又是null,然后這個函數出棧了,開始到節點3之前執行的函數出棧了,所以進棧的順序是8,3,1,1的左null,出棧的順序是1的左null,1,1的右null,3,3執行后,右邊有個6,6進棧,6有4,4進棧,這個時候棧里還有8,3,,6,4
//中序遍歷代碼,先找左子節點,再找右子節點
var inOrderTraverceNodes = function (node,callback) {
if(node !== null){
inOrderTraverceNodes(node.left,callback);
callback(node.key);//調動callback
inOrderTraverceNodes(node.right,callback);
}
}
this.inOrderTraverce = function (callback) {
inOrderTraverceNodes(this.root,callback);
}
//前序遍歷代碼,先找自己,再找左子節點,再找右子節點
var preOrderTraverceNodes = function (node,callback) {
if(node !== null){
callback(node.key);//調動callback
preOrderTraverceNodes(node.left,callback);
preOrderTraverceNodes(node.right,callback);
}
}
this.preOrderTraverce = function (callback) {
preOrderTraverceNodes(this.root,callback);
}
//后序遍歷代碼,先找左子節點,再找右子節點,需要找完自己的左右子節點
var postOrderTraverceNodes = function (node,callback) {
if(node !== null){
postOrderTraverceNodes(node.left,callback);
postOrderTraverceNodes(node.right,callback);
callback(node.key);//調動callback
}
}
this.postOrderTraverce = function (callback) {
preOrderTraverceNodes(this.root,callback);
}
//查找最小值,只需要查找左子節點
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);
}
//查找最大值,只需要查找右子節點
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);
}
//查找最小值,只需要查找左子節點
var findMinNode = function (node) {
if(node){
while (node && node.left !== null) {
node = node.left;
}
return node;
}
return null;
}
//刪除葉子節點
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){
//把右子節點覆蓋當前節點
node = node.right;
return node;
}else if(node.right === null){
//把右子節點覆蓋當前節點
node = node.left;
return node;
}else{
//例如刪除的是節點3,走到這里當前節點就是節點3了,傳入節點6,找到它的最小節點,返回當前節點,修改節點3的key為節點4,傳入節點6和要刪除的節點4,刪除后重新對節點6賦值,在返回其父節點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){
}
當我們要輸出某一個節點的值得時候,我們就把這個節點的值傳入這個回調函數中,讓這個回調函數決定怎么輸出出來
查看全部 -
==用于一般比較,===用于嚴格比較,==在比較的時候可以轉換數據類型,===嚴格比較,只要類型不匹配就返回flase
查看全部 -
“==”是"==="
var nodes=[8,3,1];
查看全部 -
Node.js
開發的APP可以在IOS和Android平臺上同時運行
console.log("Hello World");
在開發者工具中顯示
單步調試
查看全部 -
編程入門查看全部
-
后序遍歷---先遍歷左節點,然后遍歷右節點,最后打印當前父節點
查看全部 -
前序遍歷---相當于復制當前的二叉樹
查看全部 -
中序遍歷---先找左節點,然后父節點,最后右節點
查看全部 -
public?static?final?String?node=?"xxxxx"; //二叉樹前序遍歷復制數據最快
查看全部 -
document.querySelector查看全部
舉報