資料結構與演算法(二叉樹)~ 介紹二叉樹以及力扣上幾道二叉樹題目的方法和套路
資料結構與演算法(二叉樹)~ 介紹二叉樹以及力扣上幾道二叉樹題目的方法和套路
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_二叉樹的中序遍歷 的方法與套路 :
方法一:
方法二:
套路一: