1. 程式人生 > >劍指offer 62. 二叉搜尋樹的第k個結點

劍指offer 62. 二叉搜尋樹的第k個結點

題目描述

給定一棵二叉搜尋樹,請找出其中的第k小的結點。例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值為4。

思路:

補充:

二叉查詢樹(英語:Binary Search Tree),也稱為二叉搜尋樹有序二叉樹(ordered binary tree)或排序二叉樹(sorted binary tree),是指一棵空樹或者具有下列性質的二叉樹

  1. 若任意節點的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;
  2. 若任意節點的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;
  3. 任意節點的左、右子樹也分別為二叉查詢樹;
  4. 沒有鍵值相等的節點。

img

由此延伸出一條性質,二叉搜尋樹按照中序遍歷的順序打印出來正好就是排序好的順序。

所以,按照中序遍歷順序找到第k個結點就是結果。本題可以採用回溯法的中序遍歷,同時引入

if len(self.res) > k:
            return

進一步降低時間複雜度。

參考答案:

# -*- 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 not k or not pRoot:
            return None
        self.res = []
        self.midOrder(pRoot, k)
        if len(self.res) < k:
            return None
        else:
            return self.res[k-1]
    def midOrder(self, pRoot, k):
        if not pRoot:
            return
        if len(self.res) > k:
            return
        if pRoot.left:
            self.midOrder(pRoot.left, k)
        self.res.append(pRoot)
        if pRoot.right:
            self.midOrder(pRoot.right, k)

Note

  • 重點注意二叉搜尋樹的性質:二叉搜尋樹按照中序遍歷的順序打印出來正好就是排序好的順序。