數據結構-二叉搜索樹和二叉樹排序算法(python實現)


今天我們要介紹的是一種特殊的二叉樹——二叉搜索樹,同時我們也會講到一種排序算法——二叉樹排序算法。這兩者之間有什么聯系呢,我們一起來看一下吧。

開始之前呢,我們先來介紹一下如何創建一顆二叉搜索樹。

假設我們有這樣一些數據:[9,5,2,1,4,2,1,41,22,11,35,24,11,10,4,23,9,45,2,35,12,35,16,27,56,31,73]

我們就用這些數據來創建二叉排序樹。

首先,我們將第一個數據9作為二叉排序樹的根節點,

然后我們拿到第二個數據5,現在我們要進行判斷,如果59小,那么就將5插入到節點9的左子樹;如果59大的話,就把5插入到9的右子樹。經過判斷,我們將5插入到9的右左子樹,因為9的左節點為空,所以我們直接將5作為9的左節點。

接下來判斷第三個數據2,我們同樣先將29進行判斷,將2插入到9的左子樹,但是9的左節點不為空,所以我們再將29的左節點5進行判斷。25小,並且5的左節點為空,所以將2作為5的左節點。

以此類推,我們就可以畫出一顆二叉搜索樹,感興趣的同學不妨親自畫一下。

那二叉樹排序有是怎么回事呢?

我們回過頭來看我們剛剛創建好的二叉樹,前面我們已經介紹過了二叉樹的前序、中序、后序遍歷。我們不妨來嘗試一下二叉搜索樹的三序遍歷。

如果對二叉樹進行三序遍歷的話,你就會發現,二叉搜索的中序遍歷結果恰好就是從小到大排列的。

那我們就明白了,創建二叉搜索樹並進行中序遍歷就可以實現排序。

接下來照例我們用代碼實現二叉搜索樹和二叉樹排序:

#-*- coding: utf-8 -*-

class BinaryTree:
    def __init__(self, data):
        self.left = None
        self.right = None
        if type(data) == list:
            self.data = data[0]
            for d in data[1:]:
                self.insert(d)
        else:
            self.data = data

    def insert(self, data):
        bt = self
        while True:
            if data <= bt.data:
                if bt.left == None:
                    bt.left = BinaryTree(data)
                    break
                else:
                    bt = bt.left
            else:
                if bt.right == None:
                    bt.right = BinaryTree(data)
                    break
                else:
                    bt = bt.right

    def mid_order(self):
        result = []
        stack = []
        node = self
        while node or stack:
            while node:
                stack.append(node)
                node = node.left
            node = stack.pop()
            result.append(node.data)
            node = node.right
        return result

上面呢,我們定義了一個二叉樹類,並實現了節點的插入和中序遍歷方法。在它的構造方法中,如果輸入的參數是一個列表,那么我們就根據列表創建二叉搜索樹,如果是一個值那么就之創建一個根節點。

下面我們就來創建一下二叉搜索樹:

data = [9,5,2,1,4,2,1,41,22,11,35,24,11,10,4,23,9,45,2,35,12,35,16,27,56,31,73]

bt = BinaryTree(data)
mid = bt.mid_order()
print(mid)

執行一下,輸出的結果是這樣的

[1, 1, 2, 2, 2, 4, 4, 5, 9, 9, 10, 11, 11, 12, 16, 22, 23, 24, 27, 31, 35, 35, 35, 41, 45, 56, 73]

你學會了嗎?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM