题目:已知K=(5, 10, 5, 20, 17, 12, 19, 2),建立一棵二叉排序树。
解题思路:建立二叉排序树的原则:
设K=(k1, k2, k3, ..., kn)为数据元素序列。从ki开始依次取序列中的元素,每取出一个数据元素ki,按下列原则建立二叉排序树的一个结点。
1.若二叉排序树为空,则ki就是二叉排序树的根结点。
2.若二叉排序树非空,则将ki与该二叉排序树的跟结点的值进行比较。若ki小于根结点的值,则将ki插入到根结点的左子树中;否则,将ki插入到根结点的右子树中。
这是一个递归的过程,因为将一个数据元素插入到根结点的左子树或者插入到根结点的右子树,同样需要按照这个原则递归进行。
根据这个原则给出相应的算法。下面给出建立二叉排序树的非递归算法(设二叉排序树采用二叉链表存储结构)
具体算法如下:
(一) 非递归算法
function insertBST(T, item) {
let p = new Node(item, null, null), q
if ( T==null ) {
T = p
} else {
q = T
while ( 1 ) {
if ( item < q.data ) {
if ( q.lchild !=null ) {
q = q.lchild
} else {
q.lchild = p
break;
}
} else {
if ( q.rchild != null ) {
q = q.rchild
} else {
q.rchild = p
break;
}
}
}
}
return T
}
class Node{
constructor (data, lchild, rchild) {
this.data = data,
this.lchild = lchild
this.rchild = rchild
}
}
let K = [5, 10, 5, 20, 17, 12, 19, 2]
function sortTree(K) {
let n = K.length, T = null, i
if ( n > 0 ) {
for (let i = 0; i < n; i++) {
T = insertBST(T, K[i])
// console.log(T)
}
}
return T
}
var BST = sortTree(K)
(二)递归算法
function insertBST(T, item) {
if ( T==null ) {
T = new Node(item, null, null)
} else if ( item < T.data ){
insertBST( T.lchild, item )
} else {
insertBST( T.rchild, item )
}
}