1. 二叉搜索树的第k大节点
给定一棵二叉搜索树,请找出其中第k大的节点。
方法一:
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def kth_largest(root, k):
k = k
res = None
def dfs(node):
if node is None:
return None
dfs(node.right)
if k == 0:
return None
if k - 1 == 0:
res = node.val
dfs(node.left)
dfs(root)
return res
方法二:
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def kth_largest_iterative(root, k):
stack = []
count = 0
curr = root
while curr or stack:
while curr:
stack.append(curr)
curr = curr.right
curr = stack.pop()
count += 1
if count == k:
return curr.val
curr = curr.left
return None
方法三:
import heapq
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def kth_largest_heap(root, k):
def dfs(node, heap):
if node:
heapq.heappush(heap, -node.val)
dfs(node.left, heap)
dfs(node.right, heap)
heap = []
dfs(root, heap)
for _ in range(k - 1):
heapq.heappop(heap)
return -heapq.heappop(heap)
方法四:
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def inorder_traversal(node, values):
if node:
inorder_traversal(node.left, values)
values.append(node.val)
inorder_traversal(node.right, values)
def kth_largest_inorder(root, k):
values = []
inorder_traversal(root, values)
return values[-k]