上午看到一个题目,给定一个二叉搜索树(BST)的前序遍历(PreOrder)序列,给出算法构建原BST,花了几分钟时间想了个递归解(基本思路是分治,Divide & Conquer),给出了如下的Pseudo Code,用Java实现了一下,算法正确。
BUILD-BST-FROM-SEQ(s, j, r) l := r - j + 1 if l < 1 then return NIL root := MAKE-NODE() key[root] := s[j] if l = 1 then return root i := j + 1 while i < r and s[i] < s[j] do i := i + 1 left[root] := BUILD-BST-FROM-SEQ(s, j + 1, i - 1) right[root] := BUILD-BST-FROM-SEQ(s, i, r) return root
调用BUILD-BST-FROM-SEQ(s, 1, length[s])即可.
初步估计了一下,Best Case时间为O(n),Worst Case为n^2,平均情况应该是nlog(n).