请问我的python AVL树这样号写对不对,,class Node(o
请问我的python AVL树这样号写对不对,,class Node(o
class Node(object): def __init__(self,key): self.key=key self.left=None self.right=None self.height=0class AVLTree(object): def __init__(self): self.root=None def find(self,key): if self.root is None: return None else: return self._find(key,self.root) def _find(self,key,node): if node is None: return None elif key<node.key: return self._find(key,self.left) elif key>node.key: return self._find(key,self.right) else: return node def findMin(self): if self.root is None: return None else: return self._findMin(self.root) def _findMin(self,node): if node.left: return self._findMin(node.left) else: return node def findMax(self): if self.root is None: return None else: return self._findMax(self.root) def _findMax(self,node): if node.right: return self._findMax(node.right) else: return node def height(self,node): if node is None: return -1 else: return node.height def singleLeftRotate(self,node): k1=node.left node.left=k1.right k1.right=node node.height=max(self.height(node.right),self.height(node.left))+1 k1.height=max(self.height(k1.left),node.height)+1 return k1 def singleRightRotate(self,node): k1=node.right node.right=k1.left k1.left=node node.height=max(self.height(node.right),self.height(node.left))+1 k1.height=max(self.height(k1.right),node.height)+1 return k1 def doubleLeftRotate(self,node): node.left=self.singleRightRotate(node.left) return self.singleLeftRotate(node) def doubleRightRotate(self,node): node.right=self.singleLeftRotate(node.right) return self.singleRightRotate(node) def put(self,key): if not self.root: self.root=Node(key) else: self.root=self._put(key,self.root) def _put(self,key,node): if node is None: node=Node(key) elif key<node.key: node.left=self._put(key,node.left) if (self.height(node.left)-self.height(node.right))==2: if key<node.left.key: node=self.singleLeftRotate(node) else: node=self.doubleLeftRotate(node) elif key>node.key: node.right=self._put(key,node.right) if (self.height(node.right)-self.height(node.left))==2: if key<node.right.key: node=self.doubleRightRotate(node) else: node=self.singleRightRotate(node) node.height=max(self.height(node.right),self.height(node.left))+1 return node def delete(self,key): self.root=self.remove(key,self.root) def remove(self,key,node): if node is None: raise KeyError,'Error,key not in tree' elif key<node.key: node.left=self.remove(key,node.left) if (self.height(node.right)-self.height(node.left))==2: if self.height(node.right.right)>=self.height(node.right.left): node=self.singleRightRotate(node) else: node=self.doubleRightRotate(node) node.height=max(self.height(node.left),self.height(node.right))+1 elif key>node.key: node.right=self.remove(key,node.right) if (self.height(node.left)-self.height(node.right))==2: if self.height(node.left.left)>=self.height(node.left.right): node=self.singleLeftRotate(node) else: node=self.doubleLeftRotate(node) node.height=max(self.height(node.left),self.height(node.right))+1 elif node.left and node.right: if node.left.height<=node.right.height: minNode=self._findMin(node.right) node.key=minNode.key node.right=self.remove(node.key,node.right) else: maxNode=self._findMax(node.left) node.key=maxNode.key node.left=self.remove(node.key,node.left) node.height=max(self.height(node.left),self.height(node.right))+1 else: if node.right: node=node.right else: node=node.left return node
疑问就是:当第一个破坏了平衡失衡点不是根结点的时候,无论在何种情况如何旋转,都没有考虑到其父结点的指针指向问题,这样查找应该是会出问题的,是我没看懂还是什么?我翻看过C语言的实现方式,定义结构体的时候也没有父结点这回事,请问如何实现才能保证查找准确,这个代码是否有问题?
编橙之家文章,
相关内容
- Debian Python程序,用mplayer能实现渐变效果吗?,pythonmplay
- 有经验的Python大师帮看看CRC16代码实现过程错误在哪里
- Python请问PIL渲染小字号汉字截断现象怎么解决,python
- python mongoengine条件查询比较字段方法求助,pythonmongoe
- Pyhton能为视频地址解析做优化吗,pyhton能为视频解析
- Python相对路径的变化机制是什么?,python相对路径机制
- 请问BAE markdown==2.2.0添加发布不成功怎么办,markdown2.2
- 利用Python语言完成类似couchPotato工具,要做哪些准备工作
- Tornado在微信中的应用问题,信息排重写终止请求判断,
- Python2.5抓包停滞在循环中不清楚什么原因,python2.5不清
评论关闭