樹的結構十分直觀,而樹的很多概念定義都有一個相同的特點:遞歸,也就是說,一棵樹要滿足某種性質,往往要求每個節點都必須滿足。例如,在定義一棵二叉搜索樹時,每個節點也都必須是一棵二叉搜索樹。
正因為樹有這樣的性質,大部分關於樹的面試題都與遞歸有關,換句話說,面試官希望通過一道關於樹的問題來考察你對於遞歸算法掌握的熟練程度。
在面試中常考的樹的形狀有:普通二叉樹、平衡二叉樹、完全二叉樹、二叉搜索樹、四叉樹(Quadtree)、多叉樹(N-ary Tree)。
對於一些特殊的樹,例如紅黑樹(Red-Black Tree)、自平衡二叉搜索樹(AVL Tree),一般在面試中不會被問到,除非你所涉及的研究領域跟它們相關或者你十分感興趣,否則不需要特別着重准備。
關於樹的考題,無非就是要考查樹的遍歷以及序列化(serialization)。
樹的形狀
- 前序遍歷(Preorder Traversal)
方法:先訪問根節點,然后訪問左子樹,最后訪問右子樹。在訪問左、右子樹的時候,同樣,先訪問子樹的根節點,再訪問子樹根節點的左子樹和右子樹,這是一個不斷遞歸的過程。
- 中序遍歷(Inorder Traversal)
方法:先訪問左子樹,然后訪問根節點,最后訪問右子樹,在訪問左、右子樹的時候,同樣,先訪問子樹的左邊,再訪問子樹的根節點,最后再訪問子樹的右邊。
- 后序遍歷(Postorder Traversal)
方法:先訪問左子樹,然后訪問右子樹,最后訪問根節點。
LeetCode 第 230 題:給定一個二叉搜索樹,編寫一個函數 kthSmallest 來查找其中第 k 個最小的元素。
說明:你可以假設 k 總是有效的,1 ≤ k ≤ 二叉搜索樹元素個數。
def kthSmallest(self, root: TreeNode, k: int) -> int: if not root:return None stack,cur=[],root res=[] while stack or cur: if cur: stack.append(cur) cur=cur.left else: cur=stack.pop() res.append(cur.val) if len(res)==k:return res[-1] cur=cur.right
