原创 左子树上的所有节点值均小于根节点值 右子树上的所有节点值均大于根节点值 左右子树也满足上述两个条件。 遍历(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>中序遍历 (输出为递增排序的结果) : ");
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>
</body>
</html>
