1. 程式人生 > >有序數組轉化成二叉搜索數

有序數組轉化成二叉搜索數

遞歸 ima tree 密度 font pan func 快排 left

今天在網上看到一家公司的筆試題:

技術分享

這裏就不帶大家看概念了,什麽是二叉搜索樹?

下面直接看代碼

 1 //an order arr to binary search tree
 2 (function(){
 3   function main(arr){
 4       var node  = {};
 5       if(arr.length <= 1)
 6         return {data:arr[0]};
 7       var flag = Math.floor(arr.length/2);
 8       node.data = arr[flag];
 9       var
leftArr = arr.slice(0,flag); 10 var rightArr = arr.slice(flag+1); 11 node.leftSubTree = main(leftArr); 12 node.rightSubTree = main(rightArr); 13 return node; 14 } 15 var _arr = [1,2,3,4,5,6,7,8,9]; 16 console.log(main(_arr)); 17 })()

看結果:

技術分享

解釋思路:

  • 由於是有序的數組,所以可以使用折半的方法,將一塊一塊的數據分割,通常的構造二叉搜索樹的方法是,逐個比較,逐個按順序添加,如果是有序的,可想使用這種方法,查詢樹就成了反斜線了。
  • 使用這種折半的方法可以增加數的密度,減少數的深度;
  • 上面的折半的遞歸方法有點像快排,每一次都將各個分段遞歸,同時時間復雜度也是(O(nlog2n))

有序數組轉化成二叉搜索數