1. 程式人生 > >二叉查詢樹的Python實現

二叉查詢樹的Python實現

 二叉查詢樹,即左孩子小於根節點,右孩子大於根節點。
對於每一次新的節點插入操作,依據這個規則進行插入,最終使得樹的最右端為最大值,最左端為最小值。
由於二叉查詢樹是進入AVL平衡二叉樹的學習的前提,因此先進行這個的實現。

 

可以通過對節點的info屬性進行賦值,以作查詢驗證,直接執行也可以

# -*- coding: utf-8 -*-
"""
Created on Tue Dec  4 14:00:52 2018
Description:二叉查詢樹的實現

@author: HJY
"""

#二叉樹節點類定義
class Node():
    def __init__(self,item):
        self.right = None
        self.left = None
        self.item = item
        self.info = None
        
######################################################################
#Function:insert
#Author:HJY
#Description:向二叉搜尋樹中插入新的節點
#input:
#    rNode:樹的根節點
#    insertNum:需要插入的值
#Return:

#####################################################################  
def insert(rNode,insertNum):
    
    if rNode.item < insertNum:
        if rNode.right != None:
            insert(rNode.right,insertNum)
        else:  
            rNode.right = Node(insertNum)
        
    else:
        if rNode.left != None:
            insert(rNode.left,insertNum)
        else:  
            rNode.left = Node(insertNum)
                                        
######################################################################
#Function:create
#Author:HJY
#Description:根據列表建立二叉搜尋樹
#input:
#    base:列表
#Return: 返回生成的樹的根節點

#####################################################################                    
def create(base):
    root = Node(base[0])
    
    for i in range(1,len(base)):
        insert(root,base[i])
        
    return root


######################################################################
#Function:query
#Author:HJY
#Description:根據輸入的值查詢
#input:
#    root:樹的根節點
#    find:查詢的值
#Return: 查詢到的節點引用

#####################################################################
def query(root,find):
    
    if root.item is find:
        print("the result has been found!")
        return root
    
    elif root.item < find:
        if root.right != None:
            return query(root.right,find)
        else:
            print("can't found!")
            return 
    
    else:
        if root.left != None:
            return query(root.left,find)
        else:
            print("can't found!")
            return 
    

######################################################################
#Function:get_max
#Author:HJY
#Description:查詢最大值
#input:
#    root:樹的根節點
#Return: 返回最大值引用

#####################################################################   
def get_max(root):
    if root.right:
        return get_max(root.right)
    else:
        return root
    
######################################################################
#Function:get_min
#Author:HJY
#Description:查詢最小值
#input:
#    root:樹的根節點
#Return: 返回最小值引用

#####################################################################     
def get_min(root):
    if root.left:
        return get_min(root.left)
    else:
        return root

    

if __name__ == '__main__':
    base = [10,5,7,9,19,11,29,72,63,32,199,9,1]
    a = create(base)
    op = query(a,19)
    print('result:',op.info)
    maxNum = get_max(a)
    minNum = get_min(a)
    print('當前最大值:',maxNum.item)
    print('當前最小值:',minNum.item)    
'''
為什麼返回值是空呢?
遞迴呼叫的返回值問題
'''