当前位置: 首页 > 知识库问答 >
问题:

从二叉搜索树中检索

黄弘深
2023-03-14

我正在用python开发一个二叉查找树。但是我的检索方法并不像我希望的那样工作。只有当我想检索根节点时,它才返回正确的值,对于所有其他节点,它都不返回任何值。

下面是我的节点类的代码:

class Treenode:
    def __init__(self, item=None, left=None, right=None):
        self.item = item
        self.pleft = left
        self.pright = right
        self.parent = None

    def __str__(self):
        return str(self.item)

我的二叉树代码:

from Treenode import *
class Bintree:
    def __init__(self):
        self.root = None
        self.size = 0

    def insert(self, item):
        self.size += 1
        if self.root == None:
            self.root = Treenode(item)
        else:
            self.insertnode(self.root, item)

    def insertnode(self,node,item):
        if node.pleft == None and node.pright == None:
            if item > node.item:
                newnode = Treenode(item)
                node.pright = newnode
                newnode.parent = node
            else:
                newnode = Treenode(item)
                node.pleft = newnode
                newnode.parent = node
        else:
            if item > node.item:
                if node.pright != None:
                    self.insertnode(node.pright, item)
                else:
                    newnode = Treenode(item)
                    node.pright = newnode
                    newnode.parent = node 
            else:
                if node.pleft != None:
                    self.insertnode(node.pleft, item)
                else:
                    newnode = Treenode(item)
                    node.pleft = newnode
                    newnode.parent = node                  

    def print_inorder(self, root):
        if root == None:
            pass
        else:
            self.print_inorder(root.pleft)
            print(root.item)
            self.print_inorder(root.pright)

    def print_postorder(self, root):
        if root == None:
            pass
        else:
            self.print_postorder(root.pleft)
            self.print_postorder(root.pright)
            print(root.item)

    def print_preorder(self, root):
        if root == None:
            pass
        else:
            print(root.item)
            self.print_preorder(root.pleft)
            self.print_preorder(root.pright)

    def retrieve(self, node, item):
        if node == None:
            return 'Empty Tree'
        else:
            if node.item == item:
                return str(node)
            elif node.item > item:
                self.retrieve(node.pleft, item)
            elif node.item < item:
                self.retrieve(node.pright, item)

所以Bintree中的最后一个方法为除Root之外的所有值返回Not,但它应该返回节点的值。

填充树:

import BinTree
t = BinTree.Bintree()
t.insert(10)
t.insert(8)
t.insert(15)
t.insert(2)
t.insert(0)
t.insert(25)
t.insert(1)
t.insert(10)
t.print_preorder(t.root)
print('-----------------------')
t.print_inorder(t.root)
print('-----------------------')
t.print_postorder(t.root)
print('-----------------------')
temp = t.retrieve(t.root, 10)
print(temp)

共有1个答案

梁韬
2023-03-14

您的问题是没有在代码的所有路径中返回值,因此没有看到任何路径。打印不返回值的内容时,将打印“无”。将检索方法更改如下:

def retrieve(self, node, item):
    if node == None:
        return 'Empty Tree'
    else:
        if node.item == item:
            return str(node)
        elif node.item > item:
            return self.retrieve(node.pleft, item)
        elif node.item < item:
            return self.retrieve(node.pright, item)
 类似资料:
  • 我很难按我教授想要的格式打印出一个二叉搜索树。 他的格式是这样的: 我的代码:

  • 树的特征和定义 树(Tree)是元素的集合。我们先以比较直观的方式介绍树。下面的数据结构是一个树: 树有多个节点(node),用以储存元素。某些节点之间存在一定的关系,用连线表示,连线称为边(edge)。边的上端节点称为父节点,下端称为子节点。树像是一个不断分叉的树根。 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent)。比如说,3,5是6的子节点,6是3,

  • 我正在学习C++语言,我正在尝试编写BST,但是出了问题。我尝试添加元素到空树,根是NULL,但添加元素后,根仍然是NULL,尽管添加成功了(我在调试模式下看到,节点设置为tmp)。我不知道为什么会这样。

  • 我在做作业,实现自己的二叉查找树。问题是,我们有自己的节点实现,它的父节点是不可直接访问的。 我一直在寻找答案,但我不想完全照搬解决方案,尽管如此,我似乎仍然没有得到正确的答案。我错过了一些元素没有被删除的情况。 你能帮帮我吗?我做错了什么? 这是删除方法: 节点使用通用接口 只有比较的方法。它看起来像这样 我在remove中使用了另一种方法,它设置节点的父节点的子节点,具体取决于它的左子节点还是

  • 我正试图解决这个问题,但我遇到了一些麻烦: 在二进制搜索树(BST)中: 节点左子树中每个节点的数据值小于该节点的数据值。 节点右侧子树中每个节点的数据值大于该节点的数据值。 如您所见,节点(4)位于节点(3)的左侧子树中,尽管4大于3,因此方法应该返回。但是,我的代码返回。 我怎么能控制这个案子?如何检查左/右子树中的所有值都低于/大于根(不仅是直接子树)?

  • 编写一个Lisp程序来检查一个二叉树是否是二叉搜索树。 我正在尝试编写一个二进制递归方法,但我是一个初学者,我不知道从这里去哪里。