每日一记
树
一,名词:
根 :树是由一个叫做“根”的节点r以及0个或者多个非空子树组成的
边 : 子树中的每一颗根都被来自根r的一条有向边连接
树叶(叶子): 没有儿子的节点称为树叶
兄弟: 具有相同父亲的节点称为兄弟
祖父和孙子 路径:从节点n1到nk的路径定义为节点n1,n2,…nk的一个序列
路径的长: 这条路径的长为该路径上的边的条数
深度 : 对任一节点ni的深度为从根到ni的唯一路径的长
高 : 对任意一个节点ni,ni的高是从ni到一片树叶的最长路径的长
祖先 : 如果存在从n1到n2的一条路径,那么n1是n2的一位祖先
后裔 : n2是n1的一个后裔
真祖先 : n1不等于n2的时候,n1是n2的真祖先
真后裔: n1不等于n2的时候,n2是n1的真后裔
二,树的实现
class TreeNode():
def init(self,data,firstchild,nextSibling):
self.data = data
self.firstchild = firstchild
self.nextSibling = nextSibling
三,树的遍历
深度优先
广度优先
四,二叉树
最多两个孩子
五,二叉查找树(搜索树)
添加
遍历(深度优先)
递归
用python实现二叉查找树
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)