値のリストを指定して完全な二分探索木を作成するアルゴリズムを作成しようとしています。すべての要素を可能な限り左にシフトする必要がある最後のレベルを除いて、すべてのレベルがいっぱいであるという点で完了です。
次のように、バランスの取れた BST を作成するものを (Python で) 実装しました。
# TreeNode constructor takes (data, left, right, parent)
def make_tree(arr, parent):
if not arr:
return None
length = len(arr)
if length == 1:
return TreeNode(arr[0], None, None, parent)
else:
mid = int(len(arr)/2)
mid_node = TreeNode(arr[mid], None, None, parent)
mid_node.left = make_tree(arr[0:mid], mid_node)
mid_node.right = make_tree(arr[mid+1:length], mid_node)
return mid_node
リストを中間点で再帰的に分割し、中間点を親ノードにすることで機能します。
ただし、これは完全なBSTを作成しません。リスト [2,4,7,8,10] を指定すると、次のように作成されます。
7
/ \
4 10
/ /
2 8
しかし、完全な BST は次のようになります。
8
/ \
4 10
/ \
2 7
これを達成するために私のアプローチを変更する方法について何か提案はありますか?