python 二叉樹實現


二叉樹實現思想

  1、把每個節點都看作是一個對象包含以下特征:

      節點的當前值

      節點的左孩子(存儲比當前節點值小的節點對象)

      節點右孩子(存儲比當前節點值大的節點對象)

  2、二叉樹就是以根節點開始的連續的對象串

代碼實現:

# -*- coding:utf-8  -*-
# 日期:2018/6/12 8:09
# Author:小鼠標


# 節點對象
class Node:
    def __init__(self):
        self.left_children = None
        self.right_children = None
        self.value = None

# 二叉樹對象
class tree:
    def __init__(self):
        self.root = False
        self.front_list = []
        self.middle_list = []
        self.after_list = []
    # 生成二叉樹
    def create_tree(self,n=0,l=[]):
        if l == []:
            print("傳入的列表為空")
            return
        if n > len(l)-1:
            print("二叉樹生成")
            return
        node = Node()
        node.value = l[n]
        if not self.root:
           self.root = node
           self.list = l
        else:
            self.add(self.root,node)
        self.create_tree(n+1,l)
    # 添加節點
    def add(self,parent,new_node):
        if new_node.value > parent.value:
            # 插入值比父親值大,所以在父節點右邊
            if parent.right_children == None:
                parent.right_children = new_node
            else:
                self.add(parent.right_children,new_node)
        else:
            # 插入值比父親值小,所以在父節點左邊
            if parent.left_children == None:
                parent.left_children = new_node
            else:
                self.add(parent.left_children,new_node)
    # 前序(先中再左最后右)
    def front(self,node=None):
        if node == None:
            node = self.root
        # 輸出當前節點
        self.front_list.append(node.value)
        # 先判斷左枝
        if not node.left_children == None:
            self.front(node.left_children)
        # 再判斷右枝
        if not node.right_children == None:
            self.front(node.right_children)
        # 返回最終結果
        return self.front_list
    # 中序(先左再中最后右)
    def middle(self,node=None):
        if node == None:
            node = self.root
        # 先判斷左枝
        if not node.left_children == None:
            self.middle(node.left_children)
        # 輸出當前節點
        self.middle_list.append(node.value)
        # 再判斷右枝
        if not node.right_children == None:
            self.middle(node.right_children)
        return self.middle_list
    # 后序(先左再右最后中)
    def after(self,node=None):
        if node == None:
            node = self.root
        # 先判斷左枝
        if not node.left_children == None:
            self.after(node.left_children)
        # 再判斷右枝
        if not node.right_children == None:
            self.after(node.right_children)
        self.after_list.append(node.value)
        return self.after_list

    # 搜索
    def search(self,v,node=None):
        if node == None:
            node = self.root
        if node.value == v:
            return True
        if v > node.value:
            if not node.right_children == None:
                return self.search(v, node.right_children)
        else:
            if not node.left_children == None:
                return self.search(v, node.left_children)
        return False
if __name__ == '__main__':
    # 需要建立二叉樹的列表
    list = [4, 6, 3, 1, 7, 9, 8, 5, 2]
    t = tree()
    t.create_tree(0,list)
    res = t.front()
    print('前序',res)
    res = t.middle()
    print('中序',res)
    res = t.after()
    print('后序',res)
    i = t.search(8)
    print('8是否在二叉樹中',i)

  中心就是遞歸判斷傳值,遞歸取值,很簡單,下一步就是優化二叉樹,二叉樹的左旋,右旋,實現平衡二叉樹。

      


免責聲明!

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



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