一、树的定义
1.定义树的一种自然方式为递归方式,一棵树是一些节点的集合。
2.根:树中最顶端的一个节点。根通过一条有向的边与子树的根相连。
3.儿子:每一个子树的根是其上一个节点的儿子。
4.树叶(叶子节点):没有儿子的节点 。
5.兄弟:具有相同父节点的节点。
6.路径:从一个节点到另一节点的路线。
7.路径的长:从一个节点到另一节点的边数。
8.深度:从根到该节点的边数。
9.高:该节点到树叶最长路径的长。
一棵树的深度等于它最深的树叶的深度,这个深度等于这棵树的高。
10.如果存在从n1到n2的一条路径,那么n1是n2的一个祖先,n2是n1的一个后裔。如果n1≠n2,则n1是n2的真祖先,n2是n1的真后裔。
二、树的实现
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)