剑指Offer-Python-牛客网

面试题54:二叉搜索树的第k个节点

2019-01-12  本文已影响0人  凌霄文强

题目描述

给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。

知识点

二叉搜索树


Qiang的思路

因为二叉搜索树具有左子树节点小于根节点,右子树节点大于根节点的特点,所以当采取中序遍历的时候,得到的遍历序列是非递减的。此时,只要找的第k个值就是我们需要的结果。但是实际上我们并不需要得到完整的遍历序列,我们只需要遍历k个节点就能得到需要的结果。因为采取中序遍历时遍历到的第k个节点就是结果。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回对应节点TreeNode
    def getResult(self, pRoot, k):
        if pRoot.left!=None:
            node, k=self.getResult(pRoot.left, k)
            if node!=None:
                return node, k-1
        if k==1:
            return pRoot, k-1
        k-=1
        if pRoot.right!=None:
            node, k=self.getResult(pRoot.right, k)
            if node!=None:
                return node, k-1
        return None, k
    
    def KthNode(self, pRoot, k):
        # write code here
        if pRoot==None or k<1:
            return None
        node, k=self.getResult(pRoot, k)
        return node

这个题需要注意的是k的更新问题,没遍历完一个节点就需要对其做更新操作。


作者原创,如需转载及其他问题请邮箱联系:lwqiang_chn@163.com
个人网站:https://www.myqiang.top

上一篇下一篇

猜你喜欢

热点阅读