-
1.前序遍歷可用于復(fù)制一顆二叉樹 2.中序便歷可用于排序 3.后序遍歷可以用在文件系統(tǒng)里查看全部
-
計(jì)算機(jī)程序設(shè)計(jì)的本質(zhì)是 將業(yè)務(wù)邏輯轉(zhuǎn)化為數(shù)據(jù)邏輯查看全部
-
這里漏了吧,不過沒關(guān)系,也就截圖上的內(nèi)容
查看全部 -
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript二叉樹中序算法</title>
</head>
<body>
<script>
function BinaryTree() {
//初始化root根為空值
var root = null;
//將傳入值添加this.key,this.left,this.right屬性
var Node = function (key) {
this.key = key;
this.left = null;
this.right = null;
};
//將傳入值進(jìn)行判斷,作為父節(jié)點(diǎn)的左支或右支
var insertNode = function (node, newNode) {
if (newNode.key < node.key) {
//如果傳入值小于父節(jié)點(diǎn),作為左支,不過要先進(jìn)行判斷左支是否已經(jīng)存在
if (node.left === null) {
//如果左支是null空值,將傳入值作為左支
node.left = newNode;
} else {
//否則(左支已經(jīng)存在)繼續(xù)執(zhí)行函數(shù)進(jìn)行下個(gè)節(jié)點(diǎn)的判斷
insertNode(node.left, newNode);
}
} else {
//否則(傳入值大于父節(jié)點(diǎn))作為右支,不過要先進(jìn)行判斷右支是否已經(jīng)存在
if (node.right === null) {
//如果右支是null空值,將傳入值作為右支
node.right = newNode;
} else {
//否則(右支已經(jīng)存在)繼續(xù)執(zhí)行函數(shù)進(jìn)行下個(gè)節(jié)點(diǎn)的判斷
insertNode(node.right, newNode);
}
}
};
//函數(shù)的入口,第一步執(zhí)行的函數(shù),確定root根的值
this.insert = function (key) {
var newNode = new Node(key);
//newNode擁有newNode.key=key,newNode.left=null,newNode.right=null
if (root === null) {
root = newNode;
//如果沒有root根,將傳入值作為root根
} else {
insertNode(root, newNode)
//如果已經(jīng)存在根,執(zhí)行insertNode函數(shù)
}
};
//將root根值和傳入值(callback)賦給inOrderTraverseNod(),執(zhí)行inOrderTraverseNod()
this.inOrderTraverse = function (callback) {
inOrderTraverseNode(root, callback);
};
};
//傳入子節(jié)點(diǎn)(callback)和父節(jié)點(diǎn)(node)(第一次的父節(jié)點(diǎn)就是root)
var inOrderTraverseNode = function (node, callback) {
//如果父節(jié)點(diǎn)存在,繼續(xù)將左支和右支執(zhí)行inOrderTraverseNod(),直到不存在子分支為止
// !!注意if結(jié)構(gòu)里面的函數(shù)執(zhí)行順序,先執(zhí)行inOrderTraverseNode(node.left,callback);再執(zhí)行callback(node.key);最后執(zhí)行inOrderTraverseNode(node.right,callback);
//當(dāng)inOrderTraverseNode(node.left,callback);執(zhí)行完之后,才會(huì)再執(zhí)行callback(node.key);(即先打印完左分支的值,再打印最頂層的父節(jié)點(diǎn),這樣就達(dá)到了從小到大的排序效果).右分支同理
if (node !== null) {
inOrderTraverseNode(node.left, callback);
callback(node.key);
inOrderTraverseNode(node.right, callback);
}
};
var nodes = [8, 3, 10, 1, 6, 14, 4, 7, 13];
//實(shí)例化BinaryTree
var binaryTree = new BinaryTree();
//遍歷nodes數(shù)組,將每個(gè)數(shù)組的值(key)傳入binary.insert(),執(zhí)行insert()函數(shù)
nodes.forEach(function (key) {
binaryTree.insert(key);
});
//定義callback函數(shù),將傳入callback的值打印出來
var callback = function (key) {
console.log(key);
};
//注意此callback是參數(shù),不是function函數(shù),執(zhí)行的是inOrderTraverse(),不是上面的callback()
binaryTree.inOrderTraverse(callback);
</script>
</body>
</html>
查看全部 -
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript二叉樹中序算法</title>
</head>
<body>
<script>
function BinaryTree() {
//初始化root根為空值
var root = null;
//將傳入值添加this.key,this.left,this.right屬性
var Node = function (key) {
this.key = key;
this.left = null;
this.right = null;
};
//將傳入值進(jìn)行判斷,作為父節(jié)點(diǎn)的左支或右支
var insertNode = function (node, newNode) {
if (newNode.key < node.key) {
//如果傳入值小于父節(jié)點(diǎn),作為左支,不過要先進(jìn)行判斷左支是否已經(jīng)存在
if (node.left === null) {
//如果左支是null空值,將傳入值作為左支
node.left = newNode;
} else {
//否則(左支已經(jīng)存在)繼續(xù)執(zhí)行函數(shù)進(jìn)行下個(gè)節(jié)點(diǎn)的判斷
insertNode(node.left, newNode);
}
} else {
//否則(傳入值大于父節(jié)點(diǎn))作為右支,不過要先進(jìn)行判斷右支是否已經(jīng)存在
if (node.right === null) {
//如果右支是null空值,將傳入值作為右支
node.right = newNode;
} else {
//否則(右支已經(jīng)存在)繼續(xù)執(zhí)行函數(shù)進(jìn)行下個(gè)節(jié)點(diǎn)的判斷
insertNode(node.right, newNode);
}
}
};
//函數(shù)的入口,第一步執(zhí)行的函數(shù),確定root根的值
this.insert = function (key) {
var newNode = new Node(key);
//newNode擁有newNode.key=key,newNode.left=null,newNode.right=null
if (root === null) {
root = newNode;
//如果沒有root根,將傳入值作為root根
} else {
insertNode(root, newNode)
//如果已經(jīng)存在根,執(zhí)行insertNode函數(shù)
}
};
//將root根值和傳入值(callback)賦給inOrderTraverseNod(),執(zhí)行inOrderTraverseNod()
this.inOrderTraverse=function(callback){
inOrderTraverseNode(root,callback);
};
};
//傳入子節(jié)點(diǎn)(callback)和父節(jié)點(diǎn)(node)(第一次的父節(jié)點(diǎn)就是root)
var inOrderTraverseNode=function(node,callback){
//如果父節(jié)點(diǎn)存在,繼續(xù)將左支和右支執(zhí)行inOrderTraverseNod(),直到不存在子分支為止
// !!注意if結(jié)構(gòu)里面的函數(shù)執(zhí)行順序,先執(zhí)行inOrderTraverseNode(node.left,callback);再執(zhí)行callback(node.key);最后執(zhí)行inOrderTraverseNode(node.right,callback);
//當(dāng)inOrderTraverseNode(node.left,callback);執(zhí)行完之后,才會(huì)再執(zhí)行callback(node.key);(即先打印完左分支的值,再打印最頂層的父節(jié)點(diǎn),這樣就達(dá)到了從小到大的排序效果).右分支同理
if(node!==null){
inOrderTraverseNode(node.left,callback);
callback(node.key);
inOrderTraverseNode(node.right,callback);
}
};
var nodes = [8, 3, 10, 1, 6, 14, 4, 7, 13];
//實(shí)例化BinaryTree
var binaryTree = new BinaryTree();
//遍歷nodes數(shù)組,將每個(gè)數(shù)組的值(key)傳入binary.insert(),執(zhí)行insert()函數(shù)
nodes.forEach(function (key) {
binaryTree.insert(key);
});
//定義callback函數(shù),將傳入callback的值打印出來
var callback=function(key){
console.log(key);
};
//注意此callback是參數(shù),不是function函數(shù),執(zhí)行的是inOrderTraverse(),不是上面的callback()
binaryTree.inOrderTraverse(callback);
</script>
</body>
</html>
查看全部 -
<!-- 稍微改造了一下下,可視化二叉樹排序,非常有利于學(xué)習(xí)和理解喲!-->
<!DOCTYPE html> ? ?
<html> ? ?
<title>二叉排序樹</title> ? ?
? ? <head> ? ?
? ? ? ? <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> ? ?
? ? </head> ? ?
? ? <body > ? ?
? ? ? ? <canvas id="canvas" width="1366" height="768" ></canvas>
? ? </body> ? ?
</html> ? ?
? ??
<script type="text/javascript">
? ? ? ?
? ? ? ? //二叉算法函數(shù) ? ?
? ? ? ?function BinaryTree(){
? ? ? ? //node 節(jié)點(diǎn)函數(shù)
? ? ? ? var Node=function(key){
? ? ? ? ? ? this.key=key;
? ? ? ? ? ? this.left=null;
? ? ? ? ? ? this.right=null;
? ? ? ? ? ? this.x = 0;//圖形繪制坐標(biāo)
? ? ? ? ? ? this.y = 0;//圖形繪制坐標(biāo)
? ? ? ? };
? ? ? ? /**二叉樹可視圖形描述**/
? ? ? ? this.graphical = [];//圖形數(shù)組
? ? ? ? this.lrMove = 100;//左右偏移量
? ? ? ? this.udMove = 100;//上下偏移量
? ? ? ? /**==================**/
? ? ? ? //定義根節(jié)點(diǎn)
? ? ? ? var root=null;
? ? ? ? //插入節(jié)點(diǎn) 循環(huán)遞歸函數(shù) 左右分插
? ? ? ? this.insertNode=function(node,newNode){
? ? ? ? ? ? if(newNode.key < node.key){
? ? ? ? ? ? ? ? if(node.left===null){
? ? ? ? ? ? ? ? ? ? var x = node.x;
? ? ? ? ? ? ? ? ? ? var y = node.y;
? ? ? ? ? ? ? ? ? ? newNode.x = (x -= this.udMove);?
? ? ? ? ? ? ? ? ? ? newNode.y = (y += this.lrMove);
? ? ? ? ? ? ? ? ? ? node.left=newNode; ? ??
? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? this.insertNode(node.left,newNode);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? if(node.right===null){
? ? ? ? ? ? ? ? ? ? var x = node.x;
? ? ? ? ? ? ? ? ? ? var y = node.y;
? ? ? ? ? ? ? ? ? ? newNode.x = (x += this.udMove);?
? ? ? ? ? ? ? ? ? ? newNode.y = (y += this.lrMove);
? ? ? ? ? ? ? ? ? ? node.right=newNode;
? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? this.insertNode(node.right,newNode);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? };
? ? ? ? //入口程序
? ? ? ? this.insert=function(key){
? ? ? ? ? ? var newNode= new Node(key);
? ? ? ? ? ? if(root===null){
? ? ? ? ? ? ? ? root=newNode;
? ? ? ? ? ? ? ? root.x = 500;
? ? ? ? ? ? ? ? root.y = 100;
? ? ? ? ? ? ? ? this.graphical.push(root);
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? this.insertNode(root,newNode);
? ? ? ? ? ? }
? ? ? ? };
? ? ? ? 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,10,1,6,14,4,15,12,13];
? ? var binaryTree=new BinaryTree;
? ? for(var i = 0 ; i < nodes.length ; i++){
? ? ? ? ?binaryTree.insert(nodes[i]);
? ? }
? ? var callback = function(key){
? ? ? ? console.log(key)
? ? }
? ? binaryTree.inOrdertraverse(callback);
? ? /*=====================================================開始繪制================================*/
? ? var canvas = document.getElementById("canvas");
? ? var context = canvas.getContext('2d'); ?//獲取對(duì)應(yīng)的2D對(duì)象(畫筆)
? ? function draw(key,x,y){
? ? ? ? this.counter = 0;
? ? ? ? this.render = function(c){
? ? ? ? ? ? c.fillStyle = "hsl("+ this.counter +", 100%, 50%)";
? ? ? ? ? ? c.strokeStyle = '#fff'; //設(shè)置筆觸的顏色
? ? ? ? ? ? c.font = "bold 40px '字體','字體','微軟雅黑','宋體'"; //設(shè)置字體
? ? ? ? ? ? c.textBaseline = 'hanging'; //在繪制文本時(shí)使用的當(dāng)前文本基線
? ? ? ? ? ? c.fillText(key ,x ,y);?
? ? ? ? }
? ? ? ? this.update = function(){
? ? ? ? ? this.counter += 5;
? ? ? ? }
? ? }
? ? var fontCavaseArr = [];
? ? ?function init() {?
? ? ? ? loop();//繪制文字 ? ? ? ?
? ? ? ? setInterval(run, 1000/30);
? ? ? }
? ? function run(x,y){
? ? ? context.fillStyle = "rgba(0,0,0,0.1)";
? ? ? context.fillRect(0,0,1366,768); //繪制 1366*768 像素的已填充矩形:
? ? ? for (i=0; i<fontCavaseArr.length; i++) {
? ? ? ? var particle = fontCavaseArr[i];?
? ? ? ? particle.render(context);?
? ? ? ? particle.update();?
? ? ? }
? ? ? gLine();//繪制線條
? ? }
? ? function loop(){
? ? ? ? font(binaryTree.graphical[0]);
? ? }
? ? function font(obj){
? ? ? ? if(obj.key != null && obj.key != undefined){
? ? ? ? ? ? var drawFont = new draw(obj.key,obj.x,obj.y);
? ? ? ? ? ? fontCavaseArr.push(drawFont);
? ? ? ? }
? ? ? ? if(obj.left != null && obj.left != undefined){
? ? ? ? ? ? var drawFont = new draw(obj.left.key,obj.left.x,obj.left.y);
? ? ? ? ? ? fontCavaseArr.push(drawFont);
? ? ? ? ? ? font(obj.left);
? ? ? ? }
? ? ? ? if(obj.right != null && obj.right != undefined){
? ? ? ? ? ? var drawFont = new draw(obj.right.key,obj.right.x,obj.right.y);
? ? ? ? ? ? fontCavaseArr.push(drawFont);
? ? ? ? ? ? font(obj.right);
? ? ? ? }
? ? }
? ? function gLine(){
? ? ? ? line(binaryTree.graphical[0]);
? ? }
? ??
? ? function line(obj){
? ? ? ? context.lineJoin="round"; ?
? ? ? ? context.lineCap="butt"; ?
? ? ? ? context.beginPath();?
? ? ? ? if(obj.left != null && obj.left != undefined){
? ? ? ? ? ? context.moveTo(obj.x+20,obj.y+20);?
? ? ? ? ? ? context.lineTo(obj.left.x+20,obj.left.y+20);
? ? ? ? ? ? context.stroke(); ?
? ? ? ? ? ? context.closePath();?
? ? ? ? ? ? line(obj.left);
? ? ? ? }
? ? ? ? if(obj.right != null && obj.right != undefined){
? ? ? ? ? ? context.moveTo(obj.x+20,obj.y+20);?
? ? ? ? ? ? context.lineTo(obj.right.x+20,obj.right.y+20);
? ? ? ? ? ? context.stroke(); ?
? ? ? ? ? ? context.closePath();?
? ? ? ? ? ? line(obj.right);
? ? ? ? }
? ? }
? ??
? ? init();
</script> ? ?
查看全部 -
根節(jié)點(diǎn)
中間節(jié)點(diǎn)
葉子結(jié)點(diǎn)
節(jié)點(diǎn)層次:二叉樹的高
排序二叉樹:左子節(jié)點(diǎn)值小于父節(jié)點(diǎn),右子節(jié)點(diǎn)值大于父節(jié)點(diǎn)
查看全部 -
<!Doctype? html>????????//文檔聲明,便于解析
breakpoints: 單步調(diào)式
查看全部 -
* 任意節(jié)點(diǎn)的左子樹不空,則左子樹上所有結(jié)點(diǎn)的值均小于它的根結(jié)點(diǎn)的值;
* 任意節(jié)點(diǎn)的右子樹不空,則右子樹上所有結(jié)點(diǎn)的值均大于它的根結(jié)點(diǎn)的值;
* 任意節(jié)點(diǎn)的左、右子樹也分別為二叉查找樹;
* 沒有鍵值相等的節(jié)點(diǎn)。第一個(gè)節(jié)點(diǎn)為根節(jié)點(diǎn),最后的沒有子節(jié)點(diǎn)的稱為葉子節(jié)點(diǎn),中間部分稱為中間節(jié)點(diǎn)。
查看全部 -
單點(diǎn)調(diào)試功能,打斷點(diǎn)查看全部
-
這個(gè)太神奇了,原來可以通過將一個(gè)算法的數(shù)學(xué)模型,用代碼表示出來,最于明白,算法,數(shù)據(jù)結(jié)構(gòu),編程之間的關(guān)系了查看全部
-
javascript借助react native 或lonic開發(fā)出來的程序,可以輕松跨越ios 與android查看全部
-
前序遍歷復(fù)制二叉樹查看全部
-
中序遍歷-升序查看全部
-
中序遍歷、前序遍歷、后序遍歷查看全部
舉報(bào)