樹和二叉樹簡介

?一、樹

1、什么是樹?

樹狀圖是一種數據結構,它是由n(n>=1)個有限節點組成一個具有層次關系的集合。把它叫做“樹”是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點:
每個節點有零個或多個子節點;沒有父節點的節點稱為根節點;每一個非根節點有且只有一個父節點;除了根節點外,每個子節點可以分為多個不相交的子樹;
樹(tree)是包含n(n>0)個結點的有窮集,其中:
(1)每個元素稱為結點(node);
(2)有一個特定的結點被稱為根結點或樹根(root)。
(3)除根結點之外的其余數據元素被分為m(m≥0)個互不相交的集合T1,T2,……Tm-1,其中每一個集合Ti(1<=i<=m)本身也是一棵樹,被稱作原樹的子樹(subtree)。
2、相關術語
  • 節點的度:一個節點含有的子樹的個數稱為該節點的度;
  • 葉節點或終端節點:度為0的節點稱為葉節點;
  • 非終端節點或分支節點:度不為0的節點;
  • 雙親節點或父節點:若一個節點含有子節點,則這個節點稱為其子節點的父節點;
  • 孩子節點或子節點:一個節點含有的子樹的根節點稱為該節點的子節點;
  • 兄弟節點:具有相同父節點的節點互稱為兄弟節點;
  • 樹的度:一棵樹中,最大的節點的度稱為樹的度;
  • 節點的層次:從根開始定義起,根為第1層,根的子節點為第2層,以此類推;
  • 樹的高度或深度:樹中節點的最大層次;
  • 堂兄弟節點:雙親在同一層的節點互為堂兄弟;
  • 節點的祖先:從根到該節點所經分支上的所有節點;
  • 子孫:以某節點為根的子樹中任一節點都稱為該節點的子孫。
  • 森林:由m(m>=0)棵互不相交的樹的集合稱為森林;

二、二叉樹

1、什么是二叉樹?

二叉樹,就是度不差過2的樹(節點最多有兩個叉)

三、兩種特殊的二叉樹

1、滿二叉樹

一個二叉樹,如果每一個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。

2、完全二叉樹

葉節點只能出現在最下層和次下層,并且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹

滿二叉樹一定是完全二叉樹,但是完全二叉樹不一定是滿二叉樹

三、二叉樹的存儲方式

1、鏈式存儲方式

a、二叉樹的鏈式存儲:將二叉樹的節點定義為一個對象,節點之間通過類似鏈表的鏈接方式來連接。

b、節點定義

class BiTreeNode:def __init__(self,data):  #data就是傳進去的節點的值self.data = dataself.lchild = Noneself.rchild = None

?

c、二叉樹的遍歷:

I 、先(前)序遍歷:訪問根結點的操作發生在遍歷其左右子樹之前

具體操作:若二叉樹非空,則依次執行如下操作:
  • ⑴ 訪問根結點;
  • ⑵ 遍歷左子樹;
  • ⑶ 遍歷右子樹。

II、中序遍歷:訪問根結點的操作發生在遍歷其左右子樹之中(間)。

具體操作:?若二叉樹非空,則依次執行如下操作:
  • ⑴遍歷左子樹;
  • ⑵訪問根結點;
  • ⑶遍歷右子樹。

III、后序遍歷:訪問根結點的操作發生在遍歷其左右子樹之后。

若二叉樹非空,則依次執行如下操作:
  • ⑴遍歷左子樹;
  • ⑵遍歷右子樹;
  • ⑶訪問根結點。

IV、層次遍歷

用一個隊列保存被訪問的當前節點的左右孩子以實現層序遍歷。

二叉樹的遍歷代碼如下

from collections import deque   #雙向隊列
from queue import Queue    #單向隊列# import queue
# q = queue.Queue()
# q.put('ggg')
# q.get()
class BiTreeNode:def __init__(self,data):self.data = dataself.lchild = Noneself.rchild = None@classmethoddef pre_order(self,root):'''前序遍歷(根左右)'''if root: #如果有根節點print(root.data,end='')self.pre_order(root.lchild)self.pre_order(root.rchild)@classmethoddef in_order(self,root):'''中序遍歷(左根右)'''if root:self.in_order(root.lchild)print(root.data,end='')self.in_order(root.rchild)@classmethoddef out_order(self, root):'''后序遍歷(左右根)'''if root:self.out_order(root.lchild)self.out_order(root.rchild)print(root.data, end='')@classmethoddef level_order(self,root):'''層次遍歷(第一層,第二層,第三層...借助隊列來實現)'''queue = deque()queue.append(root)while len(queue) > 0:node = queue.popleft()print(node.data,end='')if node.lchild:queue.append(node.lchild)if node.rchild:queue.append(node.rchild)#創建二叉樹
a = BiTreeNode("A")
b = BiTreeNode("B")
c = BiTreeNode("C")
d = BiTreeNode("D")
e = BiTreeNode("E")
f = BiTreeNode("F")
g = BiTreeNode("G")
e.lchild = a
e.rchild = g
a.rchild = c
c.lchild = b
c.rchild = d
g.rchild = f
root = e#查看前序遍歷的結果
BiTreeNode.pre_order(root)   #EACBDGF
print('')
BiTreeNode.in_order(root)    #ABCDEGF
print('')
BiTreeNode.out_order(root)  #BDCAFGE
print('')
BiTreeNode.level_order(root)  #EAGCFBD

?

2、順序存儲方式

如上圖二叉樹標出了元素所對應的索引,那么可以有一下結論

1、父節點和左孩子節點的編號下標有什么關系?

如果已知父親節點為i,那么他的左孩子節點為2i+1

2、父節點和右孩子節點的編號下標有什么關系?

3、反過來知道孩子找父親

(n-1)/2=i  # 左孩子求父節點
(n-2)/2=i  # 右孩子求父節點

?四、二叉搜索樹

1、定義

二叉搜索樹是一棵二叉樹且滿足性質:設X是二叉樹的一個節點。如果Y是X左子樹的一個節點,那么Y.key <=X.key;

如果Y是X右子樹的一個節點,那么Y.key>= X.key? (X.key代表X節點對應的值)

通俗的說也就是?若它的左子樹不空,則左子樹上所有結點的值均小于它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大于它的根結點的值; 它的左、右子樹也分別為二叉搜索樹。

2、原理

二叉排序樹的查找過程和次優二叉樹類似,通常采取二叉鏈表作為二叉排序樹的存儲結構。中序遍歷二叉排序樹可得到一個關鍵字的有序序列,一個無序序列可以通過構造一棵二叉排序樹變成一個有序序列,構造樹的過程即為對無序序列進行排序的過程。每次插入的新的結點都是二叉排序樹上新的葉子結點,在進行插入操作時,不必移動其它結點,只需改動某個結點的指針,由空變為非空即可。搜索,插入,刪除的復雜度等于樹高,O(log(n)).

3、二叉搜索樹的創建

可參考鏈接:https://visualgo.net/en/bst

4、二叉搜索樹的遍歷

5、二叉搜索樹的查詢、插入、刪除

插入:

刪除

比如要刪除65

比如要刪除66

代碼實現:

?待續....

6、二叉搜索樹存在的問題

存在的問題:當插入的是有序的時候,假如插入的數據特別多,找是能找到,但是是很花費時間的。

可以有以下解決辦法:

  1、隨機化的二叉搜索樹(打亂順序插入)

?  2、AVL樹

查找方法有:二分查找、二叉搜索樹、哈希查找、順序查找、斐波那契查找

五、AVL樹-----擴展(了解)

1、AVL樹:AVL樹是一棵自平衡的二叉搜索樹

2、AVL樹具有以下性質:  

  • 根的左右子樹的高度只差的絕對值不能超過1
  • 根的左右子樹都是平衡二叉樹

3、AVL的實現方式:旋轉

?

六、B樹

1、B樹:B樹是一棵自平衡的多路搜索樹。常用于數據庫的索引

?

七、其他

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/278476.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278476.shtml
英文地址,請注明出處:http://en.pswp.cn/news/278476.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

對eventloop的研究

javasctipt是一門單線程的非阻塞的腳本語言&#xff0c;單線程意味著&#xff0c;JavaScript 單線程意味著&#xff0c;javascript代碼在執行的任何時候&#xff0c;都只有一個主線程來處理所有的任務。 JavaScript的事件分兩種&#xff0c;宏任務(macro-task)和微任務(micro-t…

【SSH高速進階】——struts2簡單的實例

近期剛剛入門struts2。這里做一個簡單的struts2實例來跟大家一起學習一下。 本例實現最簡單的登陸&#xff0c;僅包括兩個頁面&#xff1a;login.jsp 用來輸入username與password&#xff1b;success.jsp 為登陸成功頁面。error.jsp為登陸失敗頁面。 1、新建web項目“struts2”…

《智能家居》培訓第六天------2019-01-10

目錄&#xff1a; 一&#xff09;攝像頭 二&#xff09;照明 三&#xff09;所想 四&#xff09;總結 一&#xff09;攝像頭 攝像頭這塊學了跟沒學一樣我覺得&#xff0c;攝像頭給的api&#xff0c;yuyv轉rgb24也是給的api&#xff0c;總而言之就是&#xff0c;直接給了兩個源文…

在Linux上按大小列出文件和目錄

This page will show us how to create a list of files and folders ordered by size using standard Linux commands. 該頁面將向我們展示如何使用標準Linux命令創建按大小排序的文件和文件夾列表。 命令 (Command) To get a list with the size of each item in a folder, y…

記一次kafka數據丟失問題的排查

2019獨角獸企業重金招聘Python工程師標準>>> 數據丟失為大事&#xff0c;針對數據丟失的問題我們排查結果如下。 第一&#xff1a;是否存在數據丟失的問題&#xff1f; 存在&#xff0c;且已重現。 第二&#xff1a;是在什么地方丟失的數據&#xff0c;是否是YDB…

Maximum upload size exceede上傳文件大小超出解決

在這里記錄三種方法, 努力提高自己的姿勢水平 application.yml配置spring:servlet:multipart:enabled: truemax-file-size: 10MB #單個文件最大大小max-request-size: 1024MB #上傳數據總大小 application.properties配置spring.servlet.multipart.max-file-size10Mb #單個文件…

ipad iphone開發_如何在iPhone或iPad上更改應用程序的語言

ipad iphone開發BigTunaOnline/Shutterstock.comBigTunaOnline / Shutterstock.comApple’s iOS 13 makes the iPhone and iPad multilingual. Now, you can change the language of an individual app without changing your primary system language. Each app can have its …

Docker最全教程——從理論到實戰(七)

Docker最全教程——從理論到實戰&#xff08;七&#xff09; 原文:Docker最全教程——從理論到實戰&#xff08;七&#xff09;在本系列教程中&#xff0c;筆者希望將必要的知識點圍繞理論、流程&#xff08;工作流程&#xff09;、方法、實踐來進行講解&#xff0c;而不是單純…

Bash Cookbook 學習筆記 【中級】

Read Me 本文是以英文版<bash cookbook> 為基礎整理的筆記&#xff0c;力求脫水2018.01.21 更新完【中級】。內容包括工具、函數、中斷及時間處理等進階主題。本系列其他兩篇&#xff0c;與之互為參考 【基礎】內容涵蓋bash語法等知識點。傳送門【高級】內容涉及腳本安全…

設置Windows 10時如何創建本地帳戶

Windows 10 tries its hardest to make you use a Microsoft account. The option was already hidden, but now it’s not even offered on Windows 10 Home while you’re connected to the internet. Here’s how to create a local account anyway. Windows 10盡最大努力使…

HSQL

Hive的數據存儲  1、Hive中所有的數據都存儲在 HDFS 中&#xff0c;沒有專門的數據存儲格式&#xff08;可支持Text&#xff0c;SequenceFile&#xff0c;ParquetFile&#xff0c;RCFILE等&#xff09;  2、只需要在創建表的時候告訴 Hive 數據中的列分隔符和行分隔符&…

在PowerPoint 2010中將鼠標用作激光筆

Have you ever wished you had a laser pointer to focus attention on a key point in a PowerPoint slideshow? Today, we’ll take a look at how can use use your mouse as a laser pointer in PowerPoint 2010. 您是否曾經希望激光指示器能將注意力集中在PowerPoint幻燈…

Java 8 并發: 原子變量和 ConcurrentMap

原文地址: Java 8 Concurrency Tutorial: Atomic Variables and ConcurrentMap AtomicInteger java.concurrent.atomic 包下有很多原子操作的類。 在有些情況下&#xff0c;原子操作可以在不使用 synchronized 關鍵字和鎖的情況下解決多線程安全問題。 在內部&#xff0c;原子類…

this表示當前對象簡單實例

直接上代碼 class Message { private Channel channel ; // 保存消息發送通道 private String title ; // 消息標題 private String content ; // 消息內容 // 4、調用此構造實例化&#xff0c;此時的channel 主類ch public Message(Channel channel,String title,String cont…

twitter推文不收錄_如何使用Twitter書簽保存推文供以后使用

twitter推文不收錄Khamosh PathakKhamosh PathakTwitter has a new Bookmarks feature that lets you privately save tweets for later. If you’ve been using the Like feature as a workaround for saving tweets, here’s why you should start bookmarking. Twitter具有一…

if的作用域問題 *輸出1~6的隨機數*

1 //測試if語句2 public class TestIf {3 public static void main(String[] args){4 double d Math.random();//0~1之間的小數5 int e (int)(d*5); //[0,4]6 //int f 1(int)(d*6); //[1,6] 擲色子7 System.out.println(e);8 …

為您的Blogger博客設計一個美麗的新主題

Would you like to give your Blogger blog a fresh coat of paint with a new theme? Here’s how you can use the new Template Designer to make your Blogger site stand out from the crowd and look great. 您想給Blogger博客一個新的主題嗎&#xff1f; 您可以通過以…

Lab 6-4

In this lab, we’ll analyze the malware found in the file Lab06-04.exe. Questions and Short Answers What is the difference between the calls made from the main method in Labs 6-3 and 6-4? A: The function at 0x401000 is the check Internet connection method…

步入三十歲前的總結:看似經歷很多得到很多,但,實際卻一無所得

本文算是一篇審視自己的文章吧&#xff0c;感覺跟我類似經歷的人應該很多&#xff0c;認同感應該也大一些。我是12年網絡專業很普通的一所大專院校畢業&#xff0c;到現在為止工作已經超過五年。這五年里&#xff0c;做過運維工程師&#xff0c;也在小車床工作間里做了一下技工…

vue---day03

1. Vue的生命周期 - 創建和銷毀的時候可以做一些我們自己的事情 - beforeCreated - created - beforeMount - mounted - beforeUpdate - updated - activated - deactivated - beforeDestroy - destroyed 1.1 知識點回顧 1.1.1 be…