1. 程式人生 > 其它 >資料結構與演算法(二叉樹)~ 介紹二叉樹以及力扣上幾道二叉樹題目的方法和套路

資料結構與演算法(二叉樹)~ 介紹二叉樹以及力扣上幾道二叉樹題目的方法和套路

資料結構與演算法(二叉樹)~ 介紹二叉樹以及力扣上幾道二叉樹題目的方法和套路

1,二叉樹的資料結構:

(1)基本實現(組成):由一個一個根(或父結點)和左結點、右結點構成。

自己動手實現:定義了一個含有 資料域 左結點指標右結點指標 + (父結點【自己設計就加上,這樣方便後續的一些操作】) 的 結點類Node。

(2)二叉樹【需要先定義為一顆什麼型別的二叉樹(這樣才能按照一定規則進行結點位置的新增),這裡咱設計一棵 二叉搜尋樹主要的功能(增刪改查):定義一些介面方法

■ 主要的功能(增刪改查 + 各種方式的遍歷 【前序遍歷、中序遍歷、後序遍歷、層序遍歷】+ 前驅結點、後驅結點(針對中序遍歷的)+ 樹的深度 + 是否為完全二叉樹 ):

● 增加:制定一定比較規則(具體實現:【 二叉搜尋樹中傳入一個比較器類物件(屬性物件,可以不寫,java內建有一個compator 比較器介面 ~ 組合關係)】 /

【讓二叉搜尋樹 繼承 比較類(java內建了comparable 介面) ~ 繼承關係/ 將物件進行強制型別轉化,然後就可以使用相應的介面方法啦,例如以下:~強制型別轉化】)

● 刪除:先查詢到給結點,然後刪除結點:刪除過程~~~~~

● 查詢:查詢結點。

序遍歷: 根(父) 左子樹 右子樹 | 根(父) 右子樹 左子樹 【前序只需滿足 根最先訪問】

序遍歷: 左子樹 根(父) 右子樹 | 右子樹

根(父) 左子樹 【中序只需滿足 根中間訪問】

序遍歷:左子樹 右子樹 根(父)| 右子樹 左子樹 根(父)【後序只需滿足 根最後訪問】

序遍歷: 一層一層的結點從左到右進行訪問。

●前驅結點:中序遍歷的前一個結點。

● 後驅結點:後序遍歷的後一個結點。

(3)過程中進行重構二叉搜尋樹,將 增刪改查 或者一些通用的介面或者屬性封裝到外部抽象類或者介面(方便設計給其他類用這樣子):

    

2,二叉樹的力扣演算法題:

總結一些小套路吧(沒有通用的套路,就講一下方法哈):

✿自己需要先知道的是二叉樹的特點就是左右子樹(左右結點)構成(一般沒有特別強調的二叉樹,結點類就是左右子樹(結點)(沒給父指標結點哈,咱自己設計加的))

(1)101_對稱二叉樹 的方法 和 套路:

方法一:

方法二:

套路一:

(2)102_二叉樹的層序遍歷 的方法與套路 :

方法一:

方法二:

套路一:

(3)104_二叉樹的最大深度 的方法與套路 :

方法一:

方法二:

套路一:

(4)105_從前序與中序遍歷序列構造二叉樹 的方法與套路 :

方法一:

方法二:

套路一:

(5)106_從中序與後序遍歷序列構造二叉樹 的方法與套路 :

方法一:

方法二:

套路一:

(6)107_二叉樹的層序遍歷II 的方法與套路 :

方法一:

方法二:

套路一:

(7)114_二叉樹展開為連結串列 的方法與套路 :

方法一:

方法二:

套路一:

(8)144_二叉樹的前序遍歷 的方法與套路 :

方法一:

方法二:

套路一:

(9)145_二叉樹的後序遍歷 的方法與套路 :

方法一:

方法二:

套路一:

(10)226_翻轉二叉樹 的方法與套路 :

方法一:

方法二:

套路一:

(11)559_N叉樹的最大深度 的方法與套路 :

方法一:

方法二:

套路一:

(12)589_N叉樹的前序遍歷 的方法與套路 :

方法一:

方法二:

套路一:

(13)590_N叉樹的後序遍歷 的方法與套路 :

方法一:

方法二:

套路一:

(14)662_二叉樹最大寬度 的方法與套路 :

方法一:

方法二:

套路一:

(15)889_根據前序和後序遍歷構造二叉樹 的方法與套路 :

方法一:

方法二:

套路一:

(16)94_二叉樹的中序遍歷 的方法與套路 :

方法一:

方法二:

套路一: