二叉樹實現思想
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)
中心就是遞歸判斷傳值,遞歸取值,很簡單,下一步就是優化二叉樹,二叉樹的左旋,右旋,實現平衡二叉樹。