当前位置 : 主页 > 网络编程 > JavaScript >

数据结构动画例:二叉查找树 Binary Search Tree

来源:互联网 收集:自由互联 发布时间:2021-07-03
原创.演示见: http://runjs.cn/detail/bek3ctfb http://sandbox.runjs.cn/show/bek3ctfb 动画显示数据结构:二叉查找树BinarySearchTree的生成。 左子树上的所有节点值均小于根节点值 右子树上的所有节点值
原创. 演示见: 
http://runjs.cn/detail/bek3ctfb
http://sandbox.runjs.cn/show/bek3ctfb
动画显示 数据结构:二叉查找树 Binary Search Tree 的生成。
左子树上的所有节点值均小于根节点值
右子树上的所有节点值均大于根节点值
左右子树也满足上述两个条件。
遍历(Traversal),就是沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。
通过中序遍历, 可以输出各结点的键值为递增排序的结果
最小键值是根节点左子树的最左侧子节点的键值
最大键值是根节点右子树的最右侧子节点的键值

1. [图片] tree.png    

2. [代码]动画显示(数据结构)二叉查找树的生成    

<html >
<head>
<meta charset="utf-8"  />
<title>二叉查找树 Binary Search Tree</title>
<script>
var x = new Array(240,145,305,40,206,375,110,305,450,380);
var y = new Array(30,90,90,167,167,167,250,250,250,330);
var k = new Array(45,12,53,10,37,90,24,61,99,98);

function drawTree(){
drawNode_Branch(45,45);
setTimeout('drawNode_Branch(45,12)',2000);
setTimeout('drawNode_Branch(12,37)',4000);
setTimeout('drawNode_Branch(45,53)',6000);
setTimeout('drawNode_Branch(12,10)',8000);
setTimeout('drawNode_Branch(37,24)',10000);
setTimeout('drawNode_Branch(53,90)',12000);
setTimeout('drawNode_Branch(90,61)',14000);
setTimeout('drawNode_Branch(90,99)',16000);
setTimeout('drawNode_Branch(99,98)',18000);
}

function drawNode_Branch(key1,key2){
var a = get_index(k, key1);
var b = get_index(k, key2);
	branch(a,b);
	drawNode(x[b],y[b],key2);
}

function branch(a,b){
var g = document.getElementById("can1").getContext("2d");
 	g.strokeStyle="brown";
 	g.lineWidth=5; 
	g.beginPath();
	g.moveTo(x[a], y[a]);
	g.lineTo(x[b], y[b]);
	g.stroke();	
}

function get_index(arr, key){
	for (var i=0; i<arr.length; i++)
	if (arr[i]==key) return i;	
	return null;
}

function drawNode(x,y,key){
var g = document.getElementById("can2").getContext("2d");
g.lineWidth=3; 
g.save();
g.translate(x,y);
g.beginPath();
g.arc(0,0,25,0,2*Math.PI);
g.fillStyle="#00FFFF";
g.fill();
g.strokeStyle="green";
g.stroke();	
g.font="36px ARIAL";
g.fillStyle="black";
g.fillText(key.toString(),-20,13);
g.restore();
}
function preparation(){
	drawTree();
}
</script>
<style>
#can1{
	z-index:1;
	position:absolute;
	left:0px;
	top:0px;
	background-color:#FF0;
	
}
#can2{
	z-index:2;
	position:absolute;
	left:0px;
	top:0px;
}
#words{
	z-index:3;
	width:500px;
	position:absolute; left:0; top:300;
}
</style>
</head>

<body onLoad="preparation()">
<canvas id="can1" width="500" height="365" >  
   <p>Your browserdoes not support the canvas element!</p>  
</canvas> 
<canvas id="can2" width="500" height="365" >  
   <p>Your browserdoes not support the canvas element!</p>  
</canvas> 
<div id="words"><h2>二叉查找树 Binary Search Tree</h2>
<ol>
<li>左子树上的所有节点值均小于根节点值</li>
<li>右子树上的所有节点值均大于根节点值</li>
<li>左右子树也满足上述两个条件。</li>
<li>遍历(Traversal),就是沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。</li>
<li>通过中序遍历, 可以输出各结点的键值为递增排序的结果</li>
<li>最小键值是根节点左子树的最左侧子节点的键值</li>
<li>最大键值是根节点右子树的最右侧子节点的键值</li>
</ol>
</div>
</body>
</html>
网友评论