二叉搜索树查找最小值不清楚

Binary Search Tree Find minimum not clear

我试过的逻辑:

 def min_tree_value(self):
        
       while self.left:
            self.left = self.left.left
        
        return self.data 

实际Python程序逻辑:

def min_tree_value(self):
        if self.left is None:
            return self.data
        
        return self.left.min_tree_value()

实际的Python程序逻辑是递归形式。我在 While loop()

中尝试了相同的逻辑

我不确定我的逻辑是否正确。帮我找出不正确的逻辑并指出我错的地方。

你的逻辑差不多了,但不完全是:

def min_tree_value(self):
    node = self
    while node.left:
        # don't change the structure by rebinding node.left,
        # but iterate the tree by moving along nodes!
        node = node.left  
    return node.data 

请注意,在原始代码中,您从未在返回其值之前重新分配 self,因此您始终返回根值。

首先,题目问的是求二叉树中的最小元素

您使用的算法将找到二叉搜索树中的最小元素(因为最左边的元素是最小元素)。

要在 简单 二叉树中找到最小元素,请使用以下算法:

# Returns the min value in a binary tree 

def find_min_in_BT(root): 
    if root is None: 
        return float('inf') 
    res = root.data 
    lres = find_min_in_BT(root.leftChild) 
    rres = find_min_in_BT(root.rightChild) 
    if lres < res: 
        res = lres 
    if rres < res: 
        res = rres 
    return res 

OP改题后答案补充:

您尝试的算法的逻辑是正确的,在实现中有一个小的修正:self = self.data。他们都找到了最左边的元素。

我也测试了return相同输出的两个函数:

class Node:

    def __init__(self, data):

        self.left = None
        self.right = None
        self.data = data


    def insert(self, data):

        if self.data:
            if data < self.data:
                if self.left is None:
                    self.left = Node(data)
                else:
                    self.left.insert(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data

    def findval(self, lkpval):
        if lkpval < self.data:
            if self.left is None:
                return str(lkpval)+" Not Found"
            return self.left.findval(lkpval)
        elif lkpval > self.data:
            if self.right is None:
                return str(lkpval)+" Not Found"
            return self.right.findval(lkpval)
        else:
            print(str(self.data) + ' is found')

    def PrintTree(self):
        if self.left:
            self.left.PrintTree()
        print( self.data),
        if self.right:
            self.right.PrintTree()

    def min_tree_value_original(self):
        if self.left is None:
            return self.data
        return self.left.min_tree_value_original()

    def min_tree_value_custom(self):
        
        while self.left:
            self = self.left
        return self.data 
    
root = Node(12)
root.insert(6)
root.insert(14)
root.insert(3)
root.insert(3)
root.insert(1)
root.insert(0)
root.insert(-1)
root.insert(-2)

print(root.min_tree_value_original())
print(root.min_tree_value_custom())

输出:

-2
-2

这里-2是BST中最小最左边的元素