簡體   English   中英

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

[英]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 值之前重新分配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 他們都找到了最左邊的元素。

我還測試了返回相同 output 的兩個函數:

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())

Output:

-2
-2

這里 -2 是 BST 中最小和最左邊的元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM