二叉搜索树的第k个结点
题目简单,但是问题暴露不少。
self,实例变量、函数名的写法、函数嵌套参考:https://blog.youkuaiyun.com/u010402786/article/details/50527291
二叉搜索树的第k个节点 问题 给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
#思路1: 二叉搜索树,本身就有大小排序的特性左子树节点均小于根#右子树节点值均大于根
##,按中序遍历,找到中序的第k个节点,就是第k小的节点了。注意自己真的写中序遍历判断!
#
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回对应节点TreeNode
#定义一个实例对象的变量
def __init__(self):
self.current=0
def KthNode(self, pRoot, k):
# write code here
#思路1: 二叉搜索树,本身就有大小排序的特性左子树节点均小于根#右子树节点值均大于根
##,按中序遍历,找到中序的第k个节点,就是第k小的节点了。注意自己真的写中序遍历判断!
#用递归的写法,注意用实例对象变量来记录找到第k个结点了,提升效率
if not pRoot:
return None
#左
left_val = self.KthNode(pRoot.left, k)
if left_val:
return left_val
self.current += 1
#根
if self.current == k:
return pRoot
right_val = self.KthNode(pRoot.right, k)
#右
if right_val:
return right_val
return None
#思路2: 二叉搜索树,本身就有大小排序的特性左子树节点均小于根#右子树节点值均大于根
##,按中序遍历,得到中序遍历后的数组,即已经排好序了。注意全局变量的使用。
#找到中序的第k个节点,即第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
#思路2: 二叉搜索树,本身就有大小排序的特性左子树节点均小于根#右子树节点值均大于根
##,按中序遍历,得到中序遍历后的数组,即已经排好序了。注意全局变量的使用。
#找到中序的第k个节点,即第k小的节点了
result=[]
in_order(pRoot)
for i in range(len(result)):
if i==k-1:
return result[i]
def in_order(self,pRoot):
if not pRoot:
return None
self.in_order(pRoot.left)
result.append(pRoot)
self.in_order(pRoot.right)