-
1.前序遍历可用于复制一颗二叉树 2.中序便历可用于排序 3.后序遍历可以用在文件系统里查看全部
-
计算机程序设计的本质是 将业务逻辑转化为数据逻辑查看全部
-
这里漏了吧,不过没关系,也就截图上的内容
查看全部 -
<!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;
};
//将传入值进行判断,作为父节点的左支或右支
var insertNode = function (node, newNode) {
if (newNode.key < node.key) {
//如果传入值小于父节点,作为左支,不过要先进行判断左支是否已经存在
if (node.left === null) {
//如果左支是null空值,将传入值作为左支
node.left = newNode;
} else {
//否则(左支已经存在)继续执行函数进行下个节点的判断
insertNode(node.left, newNode);
}
} else {
//否则(传入值大于父节点)作为右支,不过要先进行判断右支是否已经存在
if (node.right === null) {
//如果右支是null空值,将传入值作为右支
node.right = newNode;
} else {
//否则(右支已经存在)继续执行函数进行下个节点的判断
insertNode(node.right, newNode);
}
}
};
//函数的入口,第一步执行的函数,确定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)
//如果已经存在根,执行insertNode函数
}
};
//将root根值和传入值(callback)赋给inOrderTraverseNod(),执行inOrderTraverseNod()
this.inOrderTraverse = function (callback) {
inOrderTraverseNode(root, callback);
};
};
//传入子节点(callback)和父节点(node)(第一次的父节点就是root)
var inOrderTraverseNode = function (node, callback) {
//如果父节点存在,继续将左支和右支执行inOrderTraverseNod(),直到不存在子分支为止
// !!注意if结构里面的函数执行顺序,先执行inOrderTraverseNode(node.left,callback);再执行callback(node.key);最后执行inOrderTraverseNode(node.right,callback);
//当inOrderTraverseNode(node.left,callback);执行完之后,才会再执行callback(node.key);(即先打印完左分支的值,再打印最顶层的父节点,这样就达到了从小到大的排序效果).右分支同理
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(),执行insert()函数
nodes.forEach(function (key) {
binaryTree.insert(key);
});
//定义callback函数,将传入callback的值打印出来
var callback = function (key) {
console.log(key);
};
//注意此callback是参数,不是function函数,执行的是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;
};
//将传入值进行判断,作为父节点的左支或右支
var insertNode = function (node, newNode) {
if (newNode.key < node.key) {
//如果传入值小于父节点,作为左支,不过要先进行判断左支是否已经存在
if (node.left === null) {
//如果左支是null空值,将传入值作为左支
node.left = newNode;
} else {
//否则(左支已经存在)继续执行函数进行下个节点的判断
insertNode(node.left, newNode);
}
} else {
//否则(传入值大于父节点)作为右支,不过要先进行判断右支是否已经存在
if (node.right === null) {
//如果右支是null空值,将传入值作为右支
node.right = newNode;
} else {
//否则(右支已经存在)继续执行函数进行下个节点的判断
insertNode(node.right, newNode);
}
}
};
//函数的入口,第一步执行的函数,确定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)
//如果已经存在根,执行insertNode函数
}
};
//将root根值和传入值(callback)赋给inOrderTraverseNod(),执行inOrderTraverseNod()
this.inOrderTraverse=function(callback){
inOrderTraverseNode(root,callback);
};
};
//传入子节点(callback)和父节点(node)(第一次的父节点就是root)
var inOrderTraverseNode=function(node,callback){
//如果父节点存在,继续将左支和右支执行inOrderTraverseNod(),直到不存在子分支为止
// !!注意if结构里面的函数执行顺序,先执行inOrderTraverseNode(node.left,callback);再执行callback(node.key);最后执行inOrderTraverseNode(node.right,callback);
//当inOrderTraverseNode(node.left,callback);执行完之后,才会再执行callback(node.key);(即先打印完左分支的值,再打印最顶层的父节点,这样就达到了从小到大的排序效果).右分支同理
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(),执行insert()函数
nodes.forEach(function (key) {
binaryTree.insert(key);
});
//定义callback函数,将传入callback的值打印出来
var callback=function(key){
console.log(key);
};
//注意此callback是参数,不是function函数,执行的是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 节点函数
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;//上下偏移量
/**==================**/
//定义根节点
var root=null;
//插入节点 循环递归函数 左右分插
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>
查看全部 -
根节点
中间节点
叶子结点
节点层次:二叉树的高
排序二叉树:左子节点值小于父节点,右子节点值大于父节点
查看全部 -
<!Doctype html> //文档声明,便于解析
breakpoints: 单步调式
查看全部 -
* 任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
* 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
* 任意节点的左、右子树也分别为二叉查找树;
* 没有键值相等的节点。第一个节点为根节点,最后的没有子节点的称为叶子节点,中间部分称为中间节点。
查看全部 -
单点调试功能,打断点查看全部
-
这个太神奇了,原来可以通过将一个算法的数学模型,用代码表示出来,最于明白,算法,数据结构,编程之间的关系了查看全部
-
javascript借助react native 或lonic开发出来的程序,可以轻松跨越ios 与android查看全部
-
前序遍历复制二叉树查看全部
-
中序遍历-升序查看全部
-
中序遍历、前序遍历、后序遍历查看全部
举报