首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我试图在python中实现二进制搜索树,插入方法不像预期的那样工作,不是在树中插入节点元素吗?

我试图在python中实现二进制搜索树,插入方法不像预期的那样工作,不是在树中插入节点元素吗?
EN

Stack Overflow用户
提问于 2022-02-24 18:15:26
回答 1查看 78关注 0票数 0
代码语言:javascript
复制
enter code here

class Node:
    def __init__(self,data=None):
        self.data = data
        self.left = None
        self.right = None


class binary_tree:

    def __init__(self):
        self.root = None


    def insert(self,data):
        if self.root is None:
            self.root = Node(data)
        else:
            cur_node = self.root
            while cur_node !=None :
                if data < cur_node.data:
                    if cur_node.left is None:
                        cur_node.left = Node(data)
                        print(cur_node.left.data)
                    else:
                        cur_node = cur_node.left
                elif data > cur_node.data:
                    if cur_node.right is None:
                        cur_node.right = Node(data)
                        print(cur_node.right.data)
                    else:
                        cur_node = cur_node.right
                else:
                    print("value already exist")


binary = binary_tree()
b = binary.insert(5)
e = binary.insert(4)
h = binary.insert(7)
print(h)

二进制搜索树的实现,插入方法不像预期的那样工作,向右侧插入节点会出现错误吗?如何使这个代码错误不受影响?二叉树搜索树实现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-28 11:39:11

代码的问题是它被卡在while循环中。注意到,条件是cur_node != None永远不会是真的。这可以很容易地从以下几个方面推断出来:

当循环至少执行一次之前,初始条件总是None.

  • In,因为只有当self.root不是true时,才能到达这个分支-- while循环的主体--我们总是为cur_node分配一个非-None值。cur_node = cur_node.leftcur_node.left不是Nonecur_node = cur_node.rightcur_node.right不是None

因此,我们需要以某种方式摆脱这个循环。解决这一问题的可能方法之一是,在找到插入项目的位置后,将while循环的条件更改为True以更好地表达我们的意图,并将循环中的break (或return)更改为:

代码语言:javascript
复制
cur_node = self.root
while True :
  if data < cur_node.data:
    if cur_node.left is None:
      cur_node.left = Node(data)
      return # break is also possible
   else:
      cur_node = cur_node.left
  elif data > cur_node.data:
    if cur_node.right is None:
      cur_node.right = Node(data)
      return # break is also possible
    else:
      cur_node = cur_node.right

我还注意到,在您的测试中,您编写的代码像insert一样返回一些内容,但实际上没有,所以应该像下面这样调用insert

代码语言:javascript
复制
binary.insert(5)
binary.insert(4)
binary.insert(7)

print(binary.root.data) # 5
print(binary.root.left.data) # 4
print(binary.root.right.data) # 7

如果希望insert返回某项内容,首先需要定义它应该返回的内容(例如插入节点),然后适当地更改代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71256475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档