视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
python实现二叉查找树
2020-11-27 14:27:27 责编:小采
文档


# -*- coding: cp936 -*-
#---------------------------------------------
# 
# author chile 
# version 1.0 
# date 2014-02-17 
# desc 二叉树 
# 
# 
# 
#---------------------------------------------
class bintree:
 def __init__(self):
 self.root = None
 
 # 前驱节点
 def treePredecessor(self,entry):
 if entry.left != None:
 return self.maxTree(entry.left)
 preNode = entry.parent
 tempNode = entry
 while preNode != None and preNode.right.value != entry.value:
 tempNode = preNode
 preNode = preNode.parent
 return preNode
 
 
 #后继节点 
 def treeSuccessor(self,entry):
 if entry.right != None:
 return self.minTree(entry.right)
 preNode = entry.parent
 tempNode = entry
 while preNode != None and preNode.left.value != entry.value:
 tempNode = preNode
 preNode = preNode.parent
 return preNode
 
 def add(self,value):
 tempNode = self.root
 parentNode = None
 entry = bintree.entry(value = value)
 while tempNode != None:
 parentNode = tempNode
 if cmp(value,parentNode.value) < 0:
 tempNode = tempNode.left
 else:
 tempNode = tempNode.right
 if parentNode == None:
 self.root = entry
 elif cmp(value,parentNode.value) < 0:
 parentNode.left = entry
 entry.parent = parentNode
 else:
 parentNode.right = entry
 entry.parent = parentNode
 
 #这里删除是全部删除节点(包括所有子节点)
 def remove(self,value):
 root = self.root
 parentNode = None
 if value == root.value:
 root.left = None
 root.right = None
 while root != None:
 parentNode = root.parent
 if value == root.value:
 root.left = None
 root.right = None
 if parentNode.left != None and parentNode.left.value == value:
 parentNode.left = None
 break
 else:
 parentNode.right = None
 break
 elif cmp(value,root.value) < 0:
 root = root.left
 else:
 root = root.right
 
 #查找节点
 def search(self,value):
 root = self.root
 while root != None and root.value != value:
 if cmp(value,root.value) < 0:
 root = root.left
 else:
 root = root.right
 return root
 
 #最小值的节点,其实就是找左边的叶子节点
 def minTree(self,root):
 entry = root
 while entry.left != None:
 entry = entry.left
 return entry
 
 #最大值的节点
 def maxTree(self,root):
 entry = root
 while entry.right != None:
 entry = entry.right
 return entry
 
 
 #中序遍历
 def iterator(self,root):
 if root != None:
 self.iterator(root.left)
 print root.value
 self.iterator(root.right)
 
 
 class entry:
 def __init__(self, value=None):
 self.left = None
 self.right = None
 self.parent = None
 self.value = value
 
arr = [15,5,3,12,10,13,6,7,16,20,18,23]
tree = bintree()
for val in arr:
 tree.add(val)
 
tree.iterator(tree.root)
node = tree.search(16)
print node.left , node.right , node.parent.value
print tree.maxTree(node).value
print tree.treePredecessor(node).value
print tree.treeSuccessor(node).value
#print tree.maxTree() , tree.minTree()

下载本文
显示全文
专题