布局二叉搜索树

时间:2014-06-25 13:05:07

标签: ocaml

这是OCaml 99

中的问题65
  

给定二进制搜索和布局,如下所示:

enter image description here


节点的y轴很简单,因为它只是级别编号,从1开始。

节点的x asix有点复杂,但是通过观察,假设整个树的高度为h,则节点的x是左子节点的最大大小,就好像它是完整的树,即x = 2 ^ (h-y)-1

但是,有一种特殊情况,我们需要处理最左边节点的x总是 1

这是我的代码:

type 'a btree = Empty | Node of 'a * 'a btree * 'a btree

type 'a pos_binary_tree =
  | E (* represents the empty tree *)
  | N of 'a * int * int * 'a pos_binary_tree * 'a pos_binary_tree

let rec height = function
  | Empty -> 0
  | Node (_,l,r) -> 1 + max (height l) (height r)

let get_fullsize h level = (2. ** (Float.of_int (h+1-level)) |> Int.of_float) - 1

let layout_btree2_correct t = 
  let h = height t in
  let rec lay off y = function
    | Empty -> get_fullsize h y, E
    | Node (w, Empty, r) when off = 0 ->
      let wtr, newr = lay 1 (y+1) r in
      1+wtr, N (w, 1, y+1, E, newr)
    | Node (w, l, r) ->
      let wt1, newl = lay off (y+1) l in
      let wt2, newr = lay (off+wt1+1) (y+1) r in
      wt1+wt2+1, N (w, off+wt1+1, y, newl, newr)
  in 
  lay 0 1 t |> snd

我的所作所为:

  1. 获得整棵树的高度
  2. 始终返回可能占用的全部宽度
  3. x应为左节点宽度+ 1
  4. 对于最左侧节点的特殊情况,它返回1 +宽度为宽度
  5. 在我的方式中,我必须先在树上旅行一次以获得高度。任何人都可以建议更好的实施,例如,只需一次去树?

1 个答案:

答案 0 :(得分:1)

您是否要求使用不同的算法来搜索树?或者以不同的方式实现该算法?

树木和树算法部分可能对您有所帮助。 http://interactivepython.org/runestone/static/pythonds/index.html