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

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

来源:互联网 收集:自由互联 发布时间:2021-07-03
原创 左子树上的所有节点值均小于根节点值 右子树上的所有节点值均大于根节点值 左右子树也满足上述两个条件。 遍历(Traversal),就是沿着某条搜索路线,依次对树中每个结点均做一
原创 
左子树上的所有节点值均小于根节点值
右子树上的所有节点值均大于根节点值
左右子树也满足上述两个条件。
遍历(Traversal),就是沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。
通过中序遍历, 可以输出各结点的键值为递增排序的结果
最小键值是根节点左子树的最左侧子节点的键值
最大键值是根节点右子树的最右侧子节点的键值
+++++++++++++++
测试代码:
<script>
var input= new Array(45,12,53,10,37,24,90,61,99,98);
var tree = new Node(45);
for (var i=1;i<input.length;i++)
insert(tree, input[i]);
document.write("前序遍历:");
preorder(tree);
document.write("<br>中序遍历  (输出为递增排序的结果) : ");
inorder(tree);
document.write("<br>后序遍历: ") ;
postorder(tree);
document.write("<br>");
document.write("最大值: " + maximum(tree));
document.write("<br>");
document.write("最小值: " +  minimum(tree));
remove(tree, 99);
document.write("<br>中序遍历  (输出为递增排序的结果) : ");
inorder(tree);
</script>
+++++++++++++++++++++++
测试输出:
前序遍历:45 12 10 37 24 53 90 61 99 98 
中序遍历  (输出为递增排序的结果) : 10 12 24 37 45 53 61 90 98 99 
后序遍历: 10 24 37 12 61 98 99 90 53 45 
最大值: 99
最小值: 10
中序遍历  (输出为递增排序的结果) : 10 12 24 37 45 53 61 90 98

1. [图片] tree.png    

2. [代码][JavaScript]代码    

<! protrammer: Xu Tongchun, July 22, 2016>
<html>
<head> 
    <title>二叉查询树 Binary Search Tree</title>
    <meta charset="utf-8">
    <script type="text/javascript">

function Node(key){  // 创建一个结点的构造方法
                this.key = key;  
                this.left = null; 
				this.right = null;
            } 
			
function insert(root,k){
/*在二叉树 root 中, 若没有键值 key 为 k 的结点, 则插入这个结点*/
	var f=root;
	var p=root;
	while( p ) {//找出即将插入的结点的父结点 f
	if(p.key==k)  //如果在现存树之中,已经有键值为 k 的结点,
	return; // 则无需再插入新结点,应立刻终止方法调用
		f=p; 
		p=(k < p.key)? p.left : p.right;
	}
	p=new Node(k); //创建键值为 k 的新结点 p
	if(!root) root=p;  //若树没有根,则新结点为树的根
	else//按键值 k 的大小,使 p 成为其父结点 f 的 左孩子或右孩子
	if (k<f.key) f.left=p; else f.right=p;
}

function remove(root, key) {/*二叉树 root 中删去关键字为 key 的结点*/
  var parent = null, p = root, q, child;
  var isleft = false;
	while(p) { //开始找待删除的结点 p
	if (p.key == key) // 如果发现关键字为 key 的结点,
	break;     // 则待删除结点 p 找到,故终止while 循环
	parent = p; // 标记父结点
	// 往下继续找 待删除结点 p
	if (key < p.key){ //若待删除的结点的键值 key 小于当前结点的键值,
	p=p.left; //则顺左子树继续找
	isleft = true; // 是左孩子
	} else { //若待删除的结点的键值 key 大于当前结点的
	p=p.right;//则右子树继续找
	isleft =false;  // 不是左孩子
		}
	}
  if (!p) return; //找不到要删除的点,则终止remove() 方法
	q = p;  // 换成 q 来标记待删除结点 p
/* 若 q 有右孩子, 则要找到 q 的右子树中的最小值的结点 p 取代之.
 * 此时 p 称为 q 的中序后继 */	
	if ( q.right) 
	for (parent=q, p=q.right; p.left; parent=p, p=p.left);
	
	// 标记 p 的孩子, 若 chil d为空, 则 p 是叶子
	child = (p.left) ? p.left : p.right; 
	
/*  删除 q 的中序后继结点 p ,  然后将 p 的键值,赋予 q,
 *  这样,待删除结点的键值, 就不复存在  
 */
	if( !parent) //若 p 没有父结点,说明 p 是 根
	root = child; //根变为 dhild
	else { //若 p 有父结点(即不是根), 则将p的孩子结点与p的父结点链接
	if (p==parent.left) 
	parent.left=child;
	else 
	parent.right = child;
	
/* 将待删除结点 q 的键值,变为中它的中序后继结点 p 的键值, 
	这样,待删除结点就不复存在 */
	if (p != q)
	q.key = p.key; 
	}
}
	
function minimum(root) { //在二叉树 root 中找出最小 key值
  var current, last;
  current = root;
  while(current) {
  last = current;
  current = current.left;
  }
return last.key;
}

function maximum(root) {//在二叉树 root 中找出最大 key值
  var current, last;
  current = root;
  while(current) {
  last = current;
  current = current.right;
  }
  return last.key;
}

function search_recursion(root, k) { //递归法 查询
	if (root == null) 
	return(null);
	else {
   if (root.key == k) return(root);
   else if (k < root.key)
   return(search_recursion(root.left, k));
   else
   return (search_recursion(root.right,k));
	}
}

function search_Iteration(root, k) {//迭代法 查询
	while (root != NULL) {
   if (root.key == k) return(root);
   else if (k < root.key)
	root = root.left;
	else
   	root = root.right;
	}
   return(null);
}
 
function inorder(root) {//中序遍历
  var p=root;
  if (p==null) return;
  inorder(p.left);
  document.write( p.key + " ");
  inorder(p.right);
}

function preorder(root) {//前序遍历
  var p=root;
  if (p==null) return;
  document.write(p.key + " ");
  preorder(p.left);
  preorder(p.right);
}


function postorder(root) {//后序遍历
  var p=root;
  if (p==null) return;
  postorder(p.left);
  postorder(p.right);
  document.write(  p.key + " ");
}

            

</script>
<style>

</style>
</head>
<body>
<script>
var input= new Array(45,12,53,10,37,24,90,61,99,98);
var tree = new Node(45);
for (var i=1;i<input.length;i++)
insert(tree, input[i]);
document.write("前序遍历:");
preorder(tree);
document.write("<br>中序遍历&nbsp; (输出为递增排序的结果)&nbsp;:&nbsp;");
inorder(tree);
document.write("<br>后序遍历: ") ;
postorder(tree);
document.write("<br>");
document.write("最大值: " + maximum(tree));
document.write("<br>");
document.write("最小值: " +  minimum(tree));
remove(tree, 99);
document.write("<br>中序遍历&nbsp; (输出为递增排序的结果)&nbsp;:&nbsp;");
inorder(tree);
</script>
</body>
</html>
网友评论