剑指offer- python实现

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

2020-04-01  本文已影响0人  不会编程的程序猿甲

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

思路:
这道题目实际上是考二叉树的遍历,如果按照中序遍历,那么随即可以得出第k大的节点。可以用递归方式和非递归方式进行遍历。

代码实现一:

class Solution:
    # 返回对应节点TreeNode
    def KthNode(self, pRoot, k):
        # write code here
        #特殊情况
        if not pRoot or k<=0:
            return None
        res = []
        def Inorder(pRoot):
            if pRoot == None:
                return []
            Inorder(pRoot.left)
            res.append(pRoot)
            Inorder(pRoot.right)
        
        Inorder(pRoot)
        if len(res)< k:
            return None
        return res[k-1]

代码实现二:

class Solution:
    # 返回对应节点TreeNode
    def KthNode(self, pRoot, k):
        # write code here
        #特殊情况
        if not pRoot or k<=0:
            return None
        def inorder2(pRoot):
            if pRoot == None:
                return []
            sol = []
            stack = []
            node = pRoot
            while node or stack:
                #左子树压入栈
                while node:
                    stack.append(node)  #压入栈
                    node = node.left
                node = stack.pop()
                sol.append(node)
                node = node.right
            return sol
        res = inorder2(pRoot)
        if len(res) <k:
            return None
        return res[k-1]

提交结果:


非递归方式
上一篇下一篇

猜你喜欢

热点阅读