1. 题目
给定一棵二叉搜索树,请找出其中第k大的节点。
2. 解题思路
详情见 面试题54. 二叉搜索树的第 k 大节点(中序遍历 + 提前返回,清晰图解)
采用一个变量记录当前节点是第几大的节点。
由于是二叉搜索树,所以最右节点为最大,然后是其父节点,然后是其左子节点,因此应该以 右-根-左的顺序遍历树
3. 代码实现
3.1 渣渣写法
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
count = 1
def kthLargest(self, root: TreeNode, k: int) -> int:
"""
1. 树的问题,首先就想到递归
2. 迭代
DFS , BFS
思想:
二叉搜索树的最右节点为最大,然后是其父节点,然后是其左子节点,所以应该以 右-根-左的顺序遍历树
"""
if not root: # 表明找到第k大的节点了
return
temp = None
r = self.kthLargest(root.right, k)
if r: self.count +=1
if k == self.count: temp = root.val
self.count += 1
l = self.kthLargest(root.left, k)
if l: self.count += 1
return r or l or temp
3.2 大佬写法
"""
每遍历一个点self.k--,当self.k==0时,这个节点就是第k大的值。遍历的顺序是:右-根-左
"""
class Solution:
def kthLargest(self, root: TreeNode, k: int) -> int:
def dfs(root):
if not root: return
dfs(root.right)
if self.k == 0: return
self.k -= 1
if self.k == 0: self.res = root.val
dfs(root.left)
self.k = k
dfs(root)
return self.res
3.3 迭代
class Solution:
def kthLargest(self, root: TreeNode, k: int) -> int:
# 右根左 非递归遍历
stack,p,count = [],root,0
while p or stack:
while p:
stack.append(p)
p = p.right
if stack:
curr = stack.pop()
count += 1
if count == k:return curr.val
p = curr.left
4. 总结
中序遍历不用递归还是比较难的呢。
5. 参考文献
[1] 剑指offer丛书
[2] 剑指Offer——名企面试官精讲典型编程题