7777733333 2022-05-10 19:50 采纳率: 87.5%
浏览 47
已结题

python实现二叉搜索树的put()函数,如果键已经在树中,就替换有效载荷,而不是用同一个键插入新节点

img

img


class BinarySearchTree:
def init(self):
self.root = None
self.size = 0

def length(self):
    return self.size

def __len__(self):
    return self.size

def __iter__(self):
    return  self.root.__iter__()

class TreeNode:
def init(self,key,val,left=None,right=None,parent=None):
self.key = key
self.payload = val
self.leftChild = left
self.rightChild = right
self.parent = parent

def hasLeftChild(self):
    return self.leftChild

def hasRightChild(self):
    return self.rightChild

def isLeftChild(self):
    return self.parent and\
           self.parent.leftChild == self

def isRightChild(self):
    return self.parent and\
           self.parent.rightChild == self

def isRoot(self):
    return not self.parent

def isLeaf(self):
    return not (self.rightChild or self.leftChild)

def hasAnyChildren(self):
    return self.rightChild or self.leftChild

def hasBothChildren(self):
    return self.rightChild and self.leftChild

def replaceNodeData(self,key,value,lc,rc):
    self.key = key
    self.payload = value
    self.leftChild = lc
    self.rightChild = rc
    if self.hasLeftChild():
        self.leftChild.parent = self
    if self.hasRightChild():
        self.rightChild.parent = self

def put(selt,key,val):
if selt.root:
selt._put(key,val,selt.root)
else:
selt.root = TreeNode(key,val)
selt.size = selt.size + 1

def _put(self,key,val,currentNode):
if key < currentNode.key:
if currentNode.hasLeftChild():
self._put(key,val,currentNode.leftChild)
else:
currentNode.leftChild = TreeNode(key,val,parent=currentNode)
elif key == currentNode.key:#如果键已在树中,就替换有效载荷
currentNode.val = val
elif key > currentNode.key:
if currentNode.hasRightChild():
self._put(key,val,currentNode.rightChild)
else:
currentNode.rightChild = TreeNode(key,val,parent=currentNode)

if name=='main':
tree = BinarySearchTree()
tree.put('a',2)
tree.put('b',14)
tree.put('c',9)
tree.put('d',7)
tree.put('c',26)

print(tree['c'])

问题:报错该如何修改?我写的put()函数是否正确?

  • 写回答

2条回答 默认 最新

  • CSDN专家-sinJack 2022-05-10 20:19
    关注

    BinarySearchTree类中并没有put方法。
    put 方法(移动)放在BinarySearchTree类中。

    class BinarySearchTree:
        def __init__(self):
            self.root = None
            self.size = 0
        def length(self):
            return self.size
         
        def __len__(self):
            return self.size
         
        def __iter__(self):
            return  self.root.__iter__()
        def put(self,key,val):
            if self.root:
                self._put(key,val,self.root)
            else:
                self.root = TreeNode(key,val)
                self.size = self.size + 1
        
        def _put(self,key,val,currentNode):
            if key < currentNode.key:
                if currentNode.hasLeftChild():
                    self._put(key,val,currentNode.leftChild)
                else:
                    currentNode.leftChild = TreeNode(key,val,parent=currentNode)
            elif key == currentNode.key:
                currentNode.val = val
                currentNode.replaceNodeData(currentNode.key,val,currentNode.leftChild,currentNode.rightChild)
            elif key > currentNode.key:
                if currentNode.hasRightChild():
                    self._put(key,val,currentNode.rightChild)
                else:
                    currentNode.rightChild = TreeNode(key,val,parent=currentNode)
             
        def get(self,key):
            if self.root:
                res = self._get(key,self.root)
                if res:
                       return res.payload
                else:
                       return None
            else:
                return None
         
        def _get(self,key,currentNode):
            if not currentNode:
                return None
            elif currentNode.key == key:
                return currentNode
            elif key < currentNode.key:
                return self._get(key,currentNode.leftChild)
            else:
                return self._get(key,currentNode.rightChild)
         
        def __getitem__(self,key):
            return self.get(key)
     
     
    class TreeNode:
        def __init__(self,key,val,left=None,right=None,parent=None):
            self.key = key
            self.payload = val
            self.leftChild = left
            self.rightChild = right
            self.parent = parent
     
        def hasLeftChild(self):
            return self.leftChild
         
        def hasRightChild(self):
            return self.rightChild
         
        def isLeftChild(self):
            return self.parent and\
                   self.parent.leftChild == self
         
        def isRightChild(self):
            return self.parent and\
                   self.parent.rightChild == self
         
        def isRoot(self):
            return not self.parent
         
        def isLeaf(self):
            return not (self.rightChild or self.leftChild)
         
        def hasAnyChildren(self):
            return self.rightChild or self.leftChild
         
        def hasBothChildren(self):
            return self.rightChild and self.leftChild
         
        def replaceNodeData(self,key,value,lc,rc):
            self.key = key
            self.payload = value
            self.leftChild = lc
            self.rightChild = rc
            if self.hasLeftChild():
                self.leftChild.parent = self
            if self.hasRightChild():
                self.rightChild.parent = self
     
     
    if __name__=='__main__':
        tree =BinarySearchTree()
        tree.put('a',2)
        tree.put('b',14)
        tree.put('c',9)
        tree.put('d',7)
        tree.put('c',26)
        print(tree.get('c'))
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月19日
  • 已采纳回答 5月11日
  • 创建了问题 5月10日

悬赏问题

  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 路易威登官网 里边的参数逆向
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
  • ¥50 需求一个up主付费课程
  • ¥20 模型在y分布之外的数据上预测能力不好如何解决
  • ¥15 processing提取音乐节奏
  • ¥15 gg加速器加速游戏时,提示不是x86架构
  • ¥15 python按要求编写程序
  • ¥15 Python输入字符串转化为列表排序具体见图,严格按照输入