我创建了一个BST。现在我想找到BST的高度。
以下是构建 BST
的代码class Node:
'''represents a new node in the BST'''
def __init__(self,key):
self.key=key
self.disconnect()
def disconnect(self):
self.left=None;
self.right=None;
self.parent=None;
def __str__(self):
return 'node with kay %s'%self.key
class BST:
def __init__(self):
self.root=None
def insert(self,t):
'''inserts a new element into the tree'''
if self.root is None:
self.root = Node(t)
else:
self._do_insert(self.root,t)
def _do_insert(self,parent,t):
if t > parent.key:
if parent.left is None:
parent.left = Node(t)
else:
self._do_insert(parent.left,t)
elif t < parent.key:
if parent.right is None:
parent.right = Node(t)
else:
self._do_insert(parent.right,t)
else:
# raise a KeyError or something appropriate?
pass
我有一个数字列表([2,4,6,3,190,1,56 and so on]
),通过它可以构建这个BST。
现在我想找到创建的BST的高度。我怎么能这样做?
修改
根据提供的解决方案,我尝试了这个: -
def create_bst(values):
'''Creates a BST and returns the BST created object'''
BSTobj = BST()
for i in values:
BSTobj.insert(i)
return BSTobj
def height_of_BST(bst):
'''Returns the height of the BST created'''
if bst == None: return 0
else: return 1 + max(height_of_BST(bst.left), height_of_BST(bst.right))
print height_of_BST(create_bst(unique_values))
它不起作用。它会弹出一个错误BST instance has no attribute 'left'
答案 0 :(得分:10)
非空二叉搜索树的高度是1 +最高子树的高度,如果没有子节点则只有1。这直接转换为递归算法。在伪代码中:
def height(bst):
if isempty(bst):
return 0
else:
return 1 + max(height(bst.left), height(bst.right))
答案 1 :(得分:1)
您班级中的BST实际上存储在BST.root中而不是BST中。您需要修改代码以查看BST.root而不是BST。
尝试:
def height(BST):
return actual_height(BST.root)
def actual_height(bst_node):
if bst_node is None:
return 0
else:
return 1 + max(actual_height(bst_node.left), actual_height(bst_node.right))
这定义了一个辅助函数,它可以完成实际的工作,但是只需要在BST对象上调用height。在将来,您可能只想要一个Node
类,因为您的BST类基本上只是root
值的包装器。
答案 2 :(得分:-1)
您可以使用hasattr检查对象是否具有attr,如果没有,则可以到达树的末尾
def height(bst_node):
if not hasattr(bst_node, 'left') or not hasattr(bst_node, 'right'):
return 0
else:
return 1 + max(height(bst_node.left), height(bst_node.right))
答案 3 :(得分:-1)
解释器正在抱怨,因为您没有检查节点没有子节点的情况。如果节点没有子节点,则高度为-1 这是一个解决方案
def height(bst):
if bst == None :
return -1
else:
return 1 + max(height(bst.left), height(bst.right))