思想
二叉樹的核心思想是分治和遞歸塞颁,特點是遍歷方式。
解題方式常見兩類思路:
- 遍歷一遍二叉樹尋找答案枚赡;
- 通過分治分解問題尋求答案勾徽;
遍歷分為前中后序贺拣,本質上是遍歷二叉樹過程中處理每個節(jié)點的三個特殊時間點:
- 前序是在剛剛進入二叉樹節(jié)點時執(zhí)行;
- 后序是在將要離開二叉樹節(jié)點時執(zhí)行捂蕴;
- 中序是左子樹遍歷完進入右子樹前執(zhí)行譬涡;
# 前序
1 node
/ \
2 left 3 right
中左右
# 中序
2 node
/ \
1 left 3 right
左中右
# 后序
3 node
/ \
1 left 2 right
左右中
多叉樹只有前后序列遍歷,因為只有二叉樹有唯一一次中間節(jié)點的遍歷
題目的關鍵就是找到遍歷過程中的位置啥辨,插入對應代碼邏輯實現場景的目的涡匀。
實例
二叉搜索樹中的搜索 leetcode 700
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
輸入:
(1)TreeNode,一棵樹的根節(jié)點溉知;
(2)int陨瘩,一個整數值
輸出:
TreeNode,判斷輸入的整數值是否存在于二叉搜索樹中级乍,存在則返回對應的子樹節(jié)點舌劳。
舉例:
輸入 root = [4,2,7,1,3], val = 2
返回 [2,1,3]
5 的右節(jié)點 4 小于 5,不滿足條件
4
/ \
2 7
/ \
1 3
二叉樹的數據存儲可以使用鏈表玫荣,也可以使用數組甚淡,往往數組更容易表達,根節(jié)點從 index=1 處開始存儲捅厂,浪費 index=0 的位置
left_child = 2 * parent
right_child = 2 * parent + 1
parent = child // 2
二叉搜索樹的檢索要利用 BST 的特性贯卦,每個節(jié)點的左子樹都比當前值小资柔,右子樹都比當前值大,這里要注意的就是剪枝提升效率撵割,當找到對應節(jié)點后不再遍歷比較贿堰,直接返回。
編碼
from typing import Optional
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def search_in_a_binary_search_tree(root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
# 全局變量啡彬,記錄目標節(jié)點
target_node = None
def traverse(root: Optional[TreeNode]) -> Optional[TreeNode]:
nonlocal target_node
# 結束條件羹与,中途找到目標則剪枝返回
if root is None or target_node is not None:
return
if root.val == val:
target_node = root
return
elif root.val > val:
traverse(root.left)
else:
traverse(root.right)
traverse(root)
return target_node
相關
二叉樹 0
二叉樹 1
二叉樹 2
二叉樹 3
二叉樹 4
二叉樹 5
二叉樹 6
二叉樹 7
二叉樹 8
二叉樹 9
二叉樹 10
二叉樹 11
二叉樹 12
二叉樹 13
二叉樹 14
二叉樹 15
二叉樹 16
二叉樹 17
二叉樹 18
二叉樹 19
二叉樹 20
二叉樹 21