**
二叉搜索树的中寻找第k小值事,需要用到中序遍历。中序遍历有两种实现方式,分别是递归和循环,记录一下两种不同的实现方式。
**
第一种:递归(代码简单,但是占用内存大)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if root == None:
return []
left = self.inorderTraversal(root.left)
right = self.inorderTraversal(root.right)
return left + [root.val] + right
第二种非递归,用循环的方式实现,需要用到一个辅助栈:
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if root == None:
return []
stack = []
res = []
temp = root
while temp or stack:
if temp != None:
stack.append(temp)
temp = temp.left
else:
temp = stack.pop()
res.append(temp.val)
temp = temp.right
return res
在二叉搜索树种应用:找到第k小的值。为了减少内存占用,应该用非递归的方式实现。代码:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回对应节点TreeNode
def KthNode(self, pRoot, k):
# write code here
if pRoot is None or k<=0:
return None
stack=[]
temp=pRoot
while stack or temp:
if temp is not None:
stack.append(temp)
temp=temp.left
else:
temp=stack.pop(-1)
if k==1:
return temp
k -= 1
temp=temp.right
return None
最后的 return None 是考虑边界,防止k溢出