?1.樹結(jié)構(gòu)術(shù)語
?2.二叉樹
1. 樹結(jié)構(gòu)術(shù)語
??樹的特點(diǎn):① 每個(gè)節(jié)點(diǎn)有0個(gè)或多個(gè)子節(jié)點(diǎn);②沒有父節(jié)點(diǎn)的稱為根節(jié)點(diǎn)级零;③每一個(gè)非根節(jié)點(diǎn)有且只有一個(gè)父節(jié)點(diǎn)断医;④除根節(jié)點(diǎn)外,每個(gè)子節(jié)點(diǎn)可以分為多個(gè)不相交的子樹奏纪。
節(jié)點(diǎn)的度
:一個(gè)節(jié)點(diǎn)含有的子樹個(gè)數(shù)
樹的度
:一棵樹中鉴嗤,最大的節(jié)點(diǎn)的度
葉節(jié)點(diǎn)
:度為0的節(jié)點(diǎn)
父節(jié)點(diǎn)
:若一個(gè)節(jié)點(diǎn)含有子節(jié)點(diǎn),該節(jié)點(diǎn)稱為該子節(jié)點(diǎn)的父節(jié)點(diǎn)
子節(jié)點(diǎn)
:一個(gè)節(jié)點(diǎn)含有的子樹的根節(jié)點(diǎn)
兄弟節(jié)點(diǎn)
:具有相同父節(jié)點(diǎn)的節(jié)點(diǎn)
節(jié)點(diǎn)的層次
:根節(jié)點(diǎn)定義為第1層亥贸,往后類推
樹的深度
:節(jié)點(diǎn)的最大層次
堂兄弟節(jié)點(diǎn)
:其父節(jié)點(diǎn)在同一層次的節(jié)點(diǎn)
節(jié)點(diǎn)的祖先
:從根節(jié)點(diǎn)到該節(jié)點(diǎn)所經(jīng)過的所有節(jié)點(diǎn)
子孫
:以某節(jié)點(diǎn)為根節(jié)點(diǎn)的子樹中任一節(jié)點(diǎn)
森林
:m(>=0)棵互不相交的樹的集合
(1)樹的種類
?無序樹
:任意節(jié)點(diǎn)的子節(jié)點(diǎn)之間沒有順序關(guān)系
?有序樹
:任意節(jié)點(diǎn)的子節(jié)點(diǎn)之間有順序關(guān)系:
???二叉樹
:每個(gè)節(jié)點(diǎn)最多含2個(gè)子節(jié)點(diǎn):
????完全二叉樹
:對于一顆二叉樹躬窜,假設(shè)其深度為d(>1),除了第d層外炕置,其他各層的節(jié)點(diǎn)數(shù)目均已達(dá)到最大值荣挨,且第d層所有節(jié)點(diǎn)從左向右連續(xù)緊密排列。(滿二叉樹:所有葉節(jié)點(diǎn)都在最底層的完全二叉樹)
????平衡二叉樹
:當(dāng)且僅當(dāng)任何節(jié)點(diǎn)的兩棵子樹的高度差不大于1的二叉樹
????排序二叉樹
:二叉查找樹(二分查找朴摊?)
???霍夫曼樹
:帶權(quán)路徑的二叉樹
???B樹
(2)樹的存儲
順序存儲:
鏈?zhǔn)酱鎯?/strong>
(3)常見樹應(yīng)用
??xml默垄、html;路由協(xié)議甚纲、mysql數(shù)據(jù)庫索引口锭、文件系統(tǒng)、決策樹等等介杆。
2. 二叉樹
(1)二叉樹的性質(zhì)
性質(zhì)1
:第i層至多有2(i-1)個(gè)節(jié)點(diǎn)
性質(zhì)2
:深度為k的二叉樹至多有2k -1個(gè)節(jié)點(diǎn)
性質(zhì)3
:任意一棵二叉樹鹃操,如果葉節(jié)點(diǎn)樹為m,度為2的節(jié)點(diǎn)總數(shù)為n春哨,則m = n + 1
性質(zhì)4
:具有n個(gè)節(jié)點(diǎn)的完全二叉樹的深度必為log2(n+1)荆隘,向下取整
性質(zhì)5
:對完全二叉樹,若從上至下赴背,從左至右編號椰拒,則編號為i的節(jié)點(diǎn)晶渠,其左孩子的編號必為2i、右孩子編號必為2i+1燃观,其雙親編號必為i/2
(2)二叉樹的遍歷
廣度優(yōu)先遍歷(層次遍歷)
:從左向右褒脯,從上至下先序遍歷
:先根,后左缆毁,再右中序遍歷
:先左番川,后根,再右后序遍歷
:先左积锅,后右爽彤,再根
(3)二叉樹實(shí)現(xiàn)
實(shí)現(xiàn)樹結(jié)構(gòu)、末尾添加節(jié)點(diǎn)缚陷、廣度優(yōu)先遍歷适篙、先序遍歷、中序遍歷箫爷、后序遍歷
#! usr/bin/env python
# coding:utf-8
#=====================================================
# Copyright (C) 2020 * Ltd. All rights reserved.
#
# Author : Chen_Sheng19
# Editor : VIM
# Create time : 2020-05-12
# File name :
# Description :
#
#=====================================================
class Node(object):
def __init__(self,item):
self.item = item
self.lchild = None
self.rchild = None
class Binary_tree(object):
def __init__(self):
self.root = None
self.travel_result = []
def add(self,item):
node = Node(item)
if self.root is None:
self.root = node
return
queue = []
queue.append(self.root)
while queue:
cur_node = queue.pop(0)
if cur_node.lchild is None:
cur_node.lchild = node
return
else:
queue.append(cur_node.lchild)
if cur_node.rchild is None:
cur_node.rchild = node
return
else:
queue.append(cur_node.rchild)
def breadth_travel(self):
if self.root is None:
return None
else:
his = []
result = []
his.append(self.root)
result.append(self.root.item)
while his:
cur = his.pop(0)
if cur.lchild is None:
return result
else:
his.append(cur.lchild)
result.append(cur.lchild.item)
if cur.rchild is None:
return result
else:
his.append(cur.rchild)
result.append(cur.rchild.item)
def pre_order_travel_op(self,node):
if node is None:
return
self.travel_result.append(node.item)
self.pre_order_travel_op(node.lchild)
self.pre_order_travel_op(node.rchild)
def pre_order_travel(self,node):
self.pre_order_travel_op(node)
print(self.travel_result)
self.travel_result = []
def mid_order_travel_op(self,node):
if node is None:
return
self.mid_order_travel_op(node.lchild)
self.travel_result.append(node.item)
self.mid_order_travel_op(node.rchild)
def mid_order_travel(self,node):
self.mid_order_travel_op(node)
print(self.travel_result)
self.travel_result = []
def post_order_travel_op(self,node):
if node is None:
return
self.post_order_travel_op(node.lchild)
self.post_order_travel_op(node.rchild)
self.travel_result.append(node.item)
def post_order_travel(self,node):
self.post_order_travel_op(node)
print(self.travel_result)
self.travel_result = []
if __name__ == "__main__":
tree = Binary_tree()
tree.add(0)
tree.add(1)
tree.add(2)
tree.add(3)
tree.add(4)
tree.add(5)
tree.add(6)
tree.add(7)
tree.add(8)
tree.add(9)
print(tree.breadth_travel())
tree.pre_order_travel(tree.root)
tree.mid_order_travel(tree.root)
tree.post_order_travel(tree.root)