-
1.前序遍歷可用于復制一顆二叉樹 2.中序便歷可用于排序 3.后序遍歷可以用在文件系統(tǒng)里查看全部
-
計算機程序設計的本質是 將業(yè)務邏輯轉化為數據邏輯查看全部
-
這里漏了吧,不過沒關系,也就截圖上的內容
查看全部 -
<!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;
};
//將傳入值進行判斷,作為父節(jié)點的左支或右支
var insertNode = function (node, newNode) {
if (newNode.key < node.key) {
//如果傳入值小于父節(jié)點,作為左支,不過要先進行判斷左支是否已經存在
if (node.left === null) {
//如果左支是null空值,將傳入值作為左支
node.left = newNode;
} else {
//否則(左支已經存在)繼續(xù)執(zhí)行函數進行下個節(jié)點的判斷
insertNode(node.left, newNode);
}
} else {
//否則(傳入值大于父節(jié)點)作為右支,不過要先進行判斷右支是否已經存在
if (node.right === null) {
//如果右支是null空值,將傳入值作為右支
node.right = newNode;
} else {
//否則(右支已經存在)繼續(xù)執(zhí)行函數進行下個節(jié)點的判斷
insertNode(node.right, newNode);
}
}
};
//函數的入口,第一步執(zhí)行的函數,確定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)
//如果已經存在根,執(zhí)行insertNode函數
}
};
//將root根值和傳入值(callback)賦給inOrderTraverseNod(),執(zhí)行inOrderTraverseNod()
this.inOrderTraverse = function (callback) {
inOrderTraverseNode(root, callback);
};
};
//傳入子節(jié)點(callback)和父節(jié)點(node)(第一次的父節(jié)點就是root)
var inOrderTraverseNode = function (node, callback) {
//如果父節(jié)點存在,繼續(xù)將左支和右支執(zhí)行inOrderTraverseNod(),直到不存在子分支為止
// !!注意if結構里面的函數執(zhí)行順序,先執(zhí)行inOrderTraverseNode(node.left,callback);再執(zhí)行callback(node.key);最后執(zhí)行inOrderTraverseNode(node.right,callback);
//當inOrderTraverseNode(node.left,callback);執(zhí)行完之后,才會再執(zhí)行callback(node.key);(即先打印完左分支的值,再打印最頂層的父節(jié)點,這樣就達到了從小到大的排序效果).右分支同理
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];
//實例化BinaryTree
var binaryTree = new BinaryTree();
//遍歷nodes數組,將每個數組的值(key)傳入binary.insert(),執(zhí)行insert()函數
nodes.forEach(function (key) {
binaryTree.insert(key);
});
//定義callback函數,將傳入callback的值打印出來
var callback = function (key) {
console.log(key);
};
//注意此callback是參數,不是function函數,執(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;
};
//將傳入值進行判斷,作為父節(jié)點的左支或右支
var insertNode = function (node, newNode) {
if (newNode.key < node.key) {
//如果傳入值小于父節(jié)點,作為左支,不過要先進行判斷左支是否已經存在
if (node.left === null) {
//如果左支是null空值,將傳入值作為左支
node.left = newNode;
} else {
//否則(左支已經存在)繼續(xù)執(zhí)行函數進行下個節(jié)點的判斷
insertNode(node.left, newNode);
}
} else {
//否則(傳入值大于父節(jié)點)作為右支,不過要先進行判斷右支是否已經存在
if (node.right === null) {
//如果右支是null空值,將傳入值作為右支
node.right = newNode;
} else {
//否則(右支已經存在)繼續(xù)執(zhí)行函數進行下個節(jié)點的判斷
insertNode(node.right, newNode);
}
}
};
//函數的入口,第一步執(zhí)行的函數,確定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)
//如果已經存在根,執(zhí)行insertNode函數
}
};
//將root根值和傳入值(callback)賦給inOrderTraverseNod(),執(zhí)行inOrderTraverseNod()
this.inOrderTraverse=function(callback){
inOrderTraverseNode(root,callback);
};
};
//傳入子節(jié)點(callback)和父節(jié)點(node)(第一次的父節(jié)點就是root)
var inOrderTraverseNode=function(node,callback){
//如果父節(jié)點存在,繼續(xù)將左支和右支執(zhí)行inOrderTraverseNod(),直到不存在子分支為止
// !!注意if結構里面的函數執(zhí)行順序,先執(zhí)行inOrderTraverseNode(node.left,callback);再執(zhí)行callback(node.key);最后執(zhí)行inOrderTraverseNode(node.right,callback);
//當inOrderTraverseNode(node.left,callback);執(zhí)行完之后,才會再執(zhí)行callback(node.key);(即先打印完左分支的值,再打印最頂層的父節(jié)點,這樣就達到了從小到大的排序效果).右分支同理
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];
//實例化BinaryTree
var binaryTree = new BinaryTree();
//遍歷nodes數組,將每個數組的值(key)傳入binary.insert(),執(zhí)行insert()函數
nodes.forEach(function (key) {
binaryTree.insert(key);
});
//定義callback函數,將傳入callback的值打印出來
var callback=function(key){
console.log(key);
};
//注意此callback是參數,不是function函數,執(zhí)行的是inOrderTraverse(),不是上面的callback()
binaryTree.inOrderTraverse(callback);
</script>
</body>
</html>
查看全部 -
<!-- 稍微改造了一下下,可視化二叉樹排序,非常有利于學習和理解喲!-->
<!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">
? ? ? ?
? ? ? ? //二叉算法函數 ? ?
? ? ? ?function BinaryTree(){
? ? ? ? //node 節(jié)點函數
? ? ? ? var Node=function(key){
? ? ? ? ? ? this.key=key;
? ? ? ? ? ? this.left=null;
? ? ? ? ? ? this.right=null;
? ? ? ? ? ? this.x = 0;//圖形繪制坐標
? ? ? ? ? ? this.y = 0;//圖形繪制坐標
? ? ? ? };
? ? ? ? /**二叉樹可視圖形描述**/
? ? ? ? this.graphical = [];//圖形數組
? ? ? ? this.lrMove = 100;//左右偏移量
? ? ? ? this.udMove = 100;//上下偏移量
? ? ? ? /**==================**/
? ? ? ? //定義根節(jié)點
? ? ? ? var root=null;
? ? ? ? //插入節(jié)點 循環(huán)遞歸函數 左右分插
? ? ? ? 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'); ?//獲取對應的2D對象(畫筆)
? ? function draw(key,x,y){
? ? ? ? this.counter = 0;
? ? ? ? this.render = function(c){
? ? ? ? ? ? c.fillStyle = "hsl("+ this.counter +", 100%, 50%)";
? ? ? ? ? ? c.strokeStyle = '#fff'; //設置筆觸的顏色
? ? ? ? ? ? c.font = "bold 40px '字體','字體','微軟雅黑','宋體'"; //設置字體
? ? ? ? ? ? c.textBaseline = 'hanging'; //在繪制文本時使用的當前文本基線
? ? ? ? ? ? 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é)點
中間節(jié)點
葉子結點
節(jié)點層次:二叉樹的高
排序二叉樹:左子節(jié)點值小于父節(jié)點,右子節(jié)點值大于父節(jié)點
查看全部 -
<!Doctype? html>????????//文檔聲明,便于解析
breakpoints: 單步調式
查看全部 -
* 任意節(jié)點的左子樹不空,則左子樹上所有結點的值均小于它的根結點的值;
* 任意節(jié)點的右子樹不空,則右子樹上所有結點的值均大于它的根結點的值;
* 任意節(jié)點的左、右子樹也分別為二叉查找樹;
* 沒有鍵值相等的節(jié)點。第一個節(jié)點為根節(jié)點,最后的沒有子節(jié)點的稱為葉子節(jié)點,中間部分稱為中間節(jié)點。
查看全部 -
單點調試功能,打斷點查看全部
-
這個太神奇了,原來可以通過將一個算法的數學模型,用代碼表示出來,最于明白,算法,數據結構,編程之間的關系了查看全部
-
javascript借助react native 或lonic開發(fā)出來的程序,可以輕松跨越ios 與android查看全部
-
前序遍歷復制二叉樹查看全部
-
中序遍歷-升序查看全部
-
中序遍歷、前序遍歷、后序遍歷查看全部
舉報