Python0218总结
树
一.树的名词:
根:节点下面有节点,边:节点之间的连接线,树叶(叶子):节点下面无节点,
兄弟:同根下的同层节点,祖父和孙子:同根下儿子节点的儿子节点,
路径:节点间所经过的边,路径的长:节点间所经过的边的距离,
深度:根节点到最下端叶子节点的距离,高度:该节点到目的节点的距离,
祖先 后裔(有唯一路径的两节点),真祖先 真后裔(两节点不相等但有唯一路径)
二.树的实现
class TreeNode():
def __init__(self,data,firstchild,nextSibling):
self.data = data
self.firstchild = firstchild #儿子关系
self.nextSibling = nextSibling #兄弟关系
三.树的遍历
深度优先
广度优先
四.二叉树
最多两个孩子
五.二叉查找树(搜索树)
遍历(深度优先)
递归
练习:
#二叉树
class TreeNode():
def __init__(self,data,left=None,right=None):
self.data = data
self.left = left
self.right = right
class Tree():
def __init__(self):
self.root = None
#添加数据
def add(self,data):
node = TreeNode(data)
if self.root == None:
self.root = node
else:
currentNode = self.root
while True:
if data < currentNode.data:
if currentNode.left==None:
currentNode.left = node
break
else:
currentNode = currentNode.left
continue
else:
if currentNode.right==None:
currentNode.right = node
break
else:
currentNode = currentNode.right
continue
#是否包含数据
def contains(self,data):
flag = False
if self.root==None:
print("空树")
else:
currentNode = self.root
while True:
if currentNode.data==data:
flag = True
break
else:
if data < currentNode.data:
if currentNode.left == None:
break
currentNode = currentNode.left
else:
if currentNode.right == None:
break
currentNode = currentNode.right
return flag
#查找最小值
def findMin(self):
temp_min = None
if self.root==None:
print("空树")
else:
currentNode = self.root
while currentNode.left != None:
currentNode = currentNode.left
temp_min = currentNode.data
return temp_min
#查找最大值
def findMax(self):
temp_max = None
if self.root == None:
print("空树")
else:
currentNode = self.root
while currentNode.right != None:
currentNode = currentNode.right
temp_max = currentNode.data
return temp_max
#删除
def remove(self,root,data):
if self.contains(data):
#树中有要删除的数据
pre_currentNode = None
currentNode = root
while True:
if currentNode.data == data:
#1,叶子节点
if currentNode.left==None and currentNode.right==None:
del currentNode
break
#2,一个孩子的节点
elif currentNode.left==None and currentNode.right!=None:
if pre_currentNode==None:
self.root = currentNode.right
break
else:
if pre_currentNode.right == currentNode:
pre_currentNode.right = currentNode.right
else:
pre_currentNode.left = currentNode.right
break
elif currentNode.left != None and currentNode.right == None:
if pre_currentNode == None:
self.root = currentNode.left
break
else:
if pre_currentNode.right == currentNode:
pre_currentNode.right = currentNode.left
else:
pre_currentNode.left = currentNode.left
break
#3,两个孩子的节点
else:
minNode = currentNode.right
while minNode.left != None:
minNode = minNode.left
currentNode.data = minNode.data
self.remove(currentNode.right,minNode.data)
break
else:
if data < currentNode.data:
pre_currentNode = currentNode
currentNode = currentNode.left
else:
pre_currentNode = currentNode
currentNode = currentNode.right
else:
#树中没有要删除的数据
print("数据不存在")
#遍历(深度优先)
def showAll(self,root):
if root==None:
print("空树")
else:
if self.root.data==root.data:
print(self.root.data)
if root.left!=None:
print(root.left.data)
self.showAll(root.left)
if root.right!=None:
print(root.right.data)
self.showAll(root.right)
tree = Tree()
tree.add(6)
tree.add(2)
tree.add(8)
tree.add(1)
tree.add(5)
tree.add(3)
tree.add(4)
tree.remove(tree.root,2)
tree.showAll(tree.root)