在 Python 中打印 BST
Printing BST in Python
我已经在 Python 中制作了 BST,但打印时遇到问题。当我尝试像这样打印它时:tree.BSTinOrder(Node(4))
,它只打印 4 及以下“None”。
一般来说,我希望它被打印得“很好”,这样它就可以以某种方式绘制树,或者至少我可以看到哪个节点与其他节点相连。
如果我想打印整棵树,我应该做某种循环吗?
我的代码:
class Node:
def __init__(self,x):
self.key = x
self.left = None
self.right = None
self.p = None
class BST:
def __init__(self):
self.root = None
def BSTsearch(self,k):
x = self.root
while x!=None and x.key!=k:
if k<x.key:
x=x.left
else:
x=x.right
return x
def BSTinsert(self, z):
x = self.root
y = None
while x != None:
y=x
if z.key<x.key:
x=x.left
else:
x=x.right
z.p=y
if y==None:
self.root=z
else:
if z.key<y.key:
y.left=z
else:
y.right=z
def bstDelete(self, z):
if z.left == None and z.right == None:
if z == self.root:
self.root = None
else:
if z == z.p.left:
z.p.left = None
else:
z.p.right = None
elif z.left != None and z.right != None:
y = self.bstMinimum(z.right)
z.key = y.key
self.bstDelete(y)
else:
if z.left != None:
z.left.p=z.p
if z==self.root:
self.root=z.left
else:
if z==z.p.left:
z.p.left=z.left
else:
z.p.right=z.left
else:
z.right.p=z.p
if z==self.root:
self.root=z.right
else:
if z==z.p.left:
z.p.left=z.left
else:
z.p.right=z.left
def bstMinimum(self, x):
while x.left != None:
x = x.left
return x
def BSTinOrder(self, x):
if x == None: return
self.BSTinOrder(x.left)
print(x.key)
self.BSTinOrder(x.right)
tree = BST()
tree.BSTinsert(Node(5))
tree.BSTinsert(Node(3))
tree.BSTinsert(Node(7))
tree.BSTinsert(Node(2))
tree.BSTinsert(Node(4))
tree.BSTinsert(Node(9))
tree.BSTinsert(Node(8))
试试这个:
class Node:
def __init__(self, x):
self.key = x
self.left = None
self.right = None
self.p = None
class BST:
def __init__(self):
self.root = None
def BSTsearch(self, k):
x = self.root
while x != None and x.key != k:
if k < x.key:
x = x.left
else:
x = x.right
return x
def BSTinsert(self, z):
x = self.root
y = None
while x != None:
y = x
if z.key < x.key:
x = x.left
else:
x = x.right
z.p = y
if y == None:
self.root = z
else:
if z.key < y.key:
y.left = z
else:
y.right = z
def bstDelete(self, z):
if z.left == None and z.right == None:
if z == self.root:
self.root = None
else:
if z == z.p.left:
z.p.left = None
else:
z.p.right = None
elif z.left != None and z.right != None:
y = self.bstMinimum(z.right)
z.key = y.key
self.bstDelete(y)
else:
if z.left != None:
z.left.p = z.p
if z == self.root:
self.root = z.left
else:
if z == z.p.left:
z.p.left = z.left
else:
z.p.right = z.left
else:
z.right.p = z.p
if z == self.root:
self.root = z.right
else:
if z == z.p.left:
z.p.left = z.left
else:
z.p.right = z.left
def bstMinimum(self, x):
while x.left != None:
x = x.left
return x
def BSTinOrder(self, x):
if x == None: return
self.BSTinOrder(x.left)
print(x.key)
self.BSTinOrder(x.right)
def bstGetRoot(self):
return self.root
tree = BST()
tree.BSTinsert(Node(5))
tree.BSTinsert(Node(3))
tree.BSTinsert(Node(7))
tree.BSTinsert(Node(2))
tree.BSTinsert(Node(4))
tree.BSTinsert(Node(9))
tree.BSTinsert(Node(8))
tree.BSTinOrder(tree.bstGetRoot())
输出:
2
3
4
5
7
8
9
我想你误解了如何遍历一棵树。你需要根。请注意我是如何添加一个方法来检索树的根,然后将其传递给 inode 遍历函数,它工作得很好。
我已经在 Python 中制作了 BST,但打印时遇到问题。当我尝试像这样打印它时:tree.BSTinOrder(Node(4))
,它只打印 4 及以下“None”。
一般来说,我希望它被打印得“很好”,这样它就可以以某种方式绘制树,或者至少我可以看到哪个节点与其他节点相连。
如果我想打印整棵树,我应该做某种循环吗?
我的代码:
class Node:
def __init__(self,x):
self.key = x
self.left = None
self.right = None
self.p = None
class BST:
def __init__(self):
self.root = None
def BSTsearch(self,k):
x = self.root
while x!=None and x.key!=k:
if k<x.key:
x=x.left
else:
x=x.right
return x
def BSTinsert(self, z):
x = self.root
y = None
while x != None:
y=x
if z.key<x.key:
x=x.left
else:
x=x.right
z.p=y
if y==None:
self.root=z
else:
if z.key<y.key:
y.left=z
else:
y.right=z
def bstDelete(self, z):
if z.left == None and z.right == None:
if z == self.root:
self.root = None
else:
if z == z.p.left:
z.p.left = None
else:
z.p.right = None
elif z.left != None and z.right != None:
y = self.bstMinimum(z.right)
z.key = y.key
self.bstDelete(y)
else:
if z.left != None:
z.left.p=z.p
if z==self.root:
self.root=z.left
else:
if z==z.p.left:
z.p.left=z.left
else:
z.p.right=z.left
else:
z.right.p=z.p
if z==self.root:
self.root=z.right
else:
if z==z.p.left:
z.p.left=z.left
else:
z.p.right=z.left
def bstMinimum(self, x):
while x.left != None:
x = x.left
return x
def BSTinOrder(self, x):
if x == None: return
self.BSTinOrder(x.left)
print(x.key)
self.BSTinOrder(x.right)
tree = BST()
tree.BSTinsert(Node(5))
tree.BSTinsert(Node(3))
tree.BSTinsert(Node(7))
tree.BSTinsert(Node(2))
tree.BSTinsert(Node(4))
tree.BSTinsert(Node(9))
tree.BSTinsert(Node(8))
试试这个:
class Node:
def __init__(self, x):
self.key = x
self.left = None
self.right = None
self.p = None
class BST:
def __init__(self):
self.root = None
def BSTsearch(self, k):
x = self.root
while x != None and x.key != k:
if k < x.key:
x = x.left
else:
x = x.right
return x
def BSTinsert(self, z):
x = self.root
y = None
while x != None:
y = x
if z.key < x.key:
x = x.left
else:
x = x.right
z.p = y
if y == None:
self.root = z
else:
if z.key < y.key:
y.left = z
else:
y.right = z
def bstDelete(self, z):
if z.left == None and z.right == None:
if z == self.root:
self.root = None
else:
if z == z.p.left:
z.p.left = None
else:
z.p.right = None
elif z.left != None and z.right != None:
y = self.bstMinimum(z.right)
z.key = y.key
self.bstDelete(y)
else:
if z.left != None:
z.left.p = z.p
if z == self.root:
self.root = z.left
else:
if z == z.p.left:
z.p.left = z.left
else:
z.p.right = z.left
else:
z.right.p = z.p
if z == self.root:
self.root = z.right
else:
if z == z.p.left:
z.p.left = z.left
else:
z.p.right = z.left
def bstMinimum(self, x):
while x.left != None:
x = x.left
return x
def BSTinOrder(self, x):
if x == None: return
self.BSTinOrder(x.left)
print(x.key)
self.BSTinOrder(x.right)
def bstGetRoot(self):
return self.root
tree = BST()
tree.BSTinsert(Node(5))
tree.BSTinsert(Node(3))
tree.BSTinsert(Node(7))
tree.BSTinsert(Node(2))
tree.BSTinsert(Node(4))
tree.BSTinsert(Node(9))
tree.BSTinsert(Node(8))
tree.BSTinOrder(tree.bstGetRoot())
输出:
2
3
4
5
7
8
9
我想你误解了如何遍历一棵树。你需要根。请注意我是如何添加一个方法来检索树的根,然后将其传递给 inode 遍历函数,它工作得很好。