二叉搜索树(Binary Search Tree),(又:二叉查找树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。
实现以下方法:
先序遍历
总序遍历
后序遍历
查找
后继
前驱
插入
删除
其它都很容易实现,删除是最难的,删除的时候要用到后继。
实现代码如下:
var t = {}; for(var i = 0; i < 10; i++){ var k = Math.floor(Math.random()*20); treeInsert(t, {key:k}); console.log("插入:", k); } treeInsert(t, {key:10}); console.log(t); console.log("中序遍历:"); inOrderTreeWalk(t.root); var a = treeSearch(t.root, 10); treeDelete(t, a); console.log("中序遍历:"); inOrderTreeWalk(t.root); function inOrderTreeWalk(x){ if(x){ inOrderTreeWalk(x.left); console.log(x.key); inOrderTreeWalk(x.right); } } function preOrderTreeWalk(x){ if(x){ console.log(x.key); preOrderTreeWalk(x.left); preOrderTreeWalk(x.right); } } function postOrderTreeWalk(x){ if(x){ postOrderTreeWalk(x.left); postOrderTreeWalk(x.right); console.log(x.key); } } function treeSearch(x, k){ if(!x || x.key == k){ return x; } if(k < x.key){ return treeSearch(x.left, k); } return treeSearch(x.right, k); } function iteractiveTreeSearch(x, k){ if(x && x.key != k){ if(k < x.key){ x = x.left; } else{ x = x.right; } } return x; } function treeMinimum(x){ while(x.left){ x = x.left; } return x; } function treeMaximum(x){ while(x.right){ x = x.right; } return x; } function treeSuccessor(x){ if(x.right){ return treeMinimum(x.right); } var y = x.parent; while(y && x == y.right){ x = y; y = y.parent; } return y; } function treePredecessor(x){ if(x.left){ return treeMaximum(x.left); } var y = x.parent; if(y && x == y.left){ x = y; y = y.parent; } return y; } function treeInsert(t, z){ var y = null; var x = t.root; while(x){ y = x; if(z.key < x.key){ x = x.left; } else { x= x.right; } } z.parent = y; if(!y){ t.root = z; } else if(z.key < y.key){ y.left = z; } else { y.right = z; } } function transPlant(t, u, v){ if(!u.parent){ t.root = v; } else if(u == u.parent.left){ u.parent.left = v; } else { u.parent.right = v; } if(v){ v.parent = u.parent; } } function treeDelete(t, z){ if(!z.left){ transPlant(t, z, z.right); } else if(!z.right){ transPlant(t, z, z.left); } else{ y = treeMinimum(z.right); if(y.parent!=z){ transPlant(t, y, y.right); y.right = z.right; y.right.parent = y; } transPlant(t, z, y); y.left = z.left; y.left.parent = y; } }
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。