劍指offer 62. 二叉搜尋樹的第k個結點
阿新 • • 發佈:2018-11-26
題目描述
給定一棵二叉搜尋樹,請找出其中的第k小的結點。例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值為4。
思路:
補充:
二叉查詢樹(英語:Binary Search Tree),也稱為二叉搜尋樹、有序二叉樹(ordered binary tree)或排序二叉樹(sorted binary tree),是指一棵空樹或者具有下列性質的二叉樹:
- 若任意節點的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;
- 若任意節點的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;
- 任意節點的左、右子樹也分別為二叉查詢樹;
- 沒有鍵值相等的節點。
由此延伸出一條性質,二叉搜尋樹按照中序遍歷的順序打印出來正好就是排序好的順序。
所以,按照中序遍歷順序找到第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
- 重點注意二叉搜尋樹的性質:二叉搜尋樹按照中序遍歷的順序打印出來正好就是排序好的順序。