1. 程式人生 > >劍指offer-面試題63:二叉搜尋樹的第K個結點

劍指offer-面試題63:二叉搜尋樹的第K個結點

題目:給定一棵二叉搜尋樹,請找出其中的第K大的結點。例如下圖中的二叉樹,按加點數值大小順序第三個結點的值是4。


思路:二叉搜尋樹的一個重要性質就是它的中序遍歷是排序的,因此這道題目只需要用中序遍歷演算法遍歷一棵二叉搜尋樹,就很容易找出它的第K大結點。中序遍歷用遞迴實現比較容易,但要想清楚的是遍歷到一個根結點的時候要做的是什麼?中序遍歷二叉樹列印的時候我們在遞迴完左子樹之後列印根結點,本題目要求的當然不是列印,如果左子結點不是要找的結點,才會訪問根結點,所以訪問到根結點的時候要做的操作是將k減去1,因為左子結點已經證實不是要找的結點了,排除左子結點。這個過程可以看成目標移位的過程,每移過一個結點,K減1,直到K等於1時,當前結點就是要求的結點。

BinaryTreeNode* KthNode(BinaryTreeNode* pRoot, unsigned int k)
{
    if(pRoot == NULL || k == 0)
        return NULL;
        
    return KthNodeCore(pRoot, k);
}

BinaryTreeNode* KthNodeCore(BinaryTreeNode* pRoot, unsigned int& k)
{
    BinaryTreeNode* target = NULL;
    
    if(pRoot->m_pLeft != NULL)
        target = KthNodeCore(pRoot->m_pLeft, k);
        
    if(target == NULL)
    {
        if(k == 1)
            target = pRoot;
            
        k--;
    }
    
    if(target == NULL && pRoot->m_pRight != NULL)
        target = KthNodeCore(pRoot->m_pRight, k);
        
    return target;
}


相關推薦

offer-試題63搜尋K結點

題目:給定一棵二叉搜尋樹,請找出其中的第K大的結點。例如下圖中的二叉樹,按加點數值大小順序第三個結點的值是4。 思路:二叉搜尋樹的一個重要性質就是它的中序遍歷是排序的,因此這道題目只需要用中序遍歷演

offer--試題63搜尋k結點

題目描述 給定一顆二叉搜尋樹,請找出其中的第k小的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。 python實現: # -*- co

offer試題63搜尋k節點 Java實現

/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 號:v1.0

offer{試題24搜尋的後序遍歷序列}

這個題似曾相識,之前劍指offer有一道題是判斷該子樹是否是樹的一部分,有異曲同工之妙,看到這種題,上倆就應該想遞迴。 public class Solution { public boolean VerifySquenceOfBST(int [] sequence) {

offer 試題8的下一個節點 c++

題目:給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。 解析:三種情況:1.若節點有右子樹,中序下一個就是 右子樹最左孩子節點  2.若無右子樹,且當前節點是父節點的左子節點,下一個就是父節點 &nb

offer{試題25中和為某一值的路徑}

思路:這道題比較有意思,類似的題我在面試裡經常遇到過,圍繞著樹的深度遍歷和廣度遍歷做文章,針對這種型別的題,大家更多考慮的解決方案是遞迴,說白了二叉樹就是一群小二叉樹,上次做寶寶樹的筆試題的時候,出的演算法題就是求任意兩個節點之間的最遠距離,說白了還是遍歷的問題,回到這道題  &n

offer試題的下一個節點

題目描述: 給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。 思路 1.若該節點存在右子樹:則下一個節點為右子樹最左子節點(如圖節點 B ) 2. 若該節點不存在右子樹:這時分兩

offer{試題19 的映象}

public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) {

Offer 試題34中和為某一值的路徑 Java程式碼實現

題目:輸入一棵二叉樹和整數,打印出二叉樹中節點值得和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。 解題思路:路徑從根節點開始,應該用類似於前序遍歷的方式訪問樹節點。

offer試題8的下一個節點(Java 實現)

題目:給定一個二叉樹和其中的一個節點,如何找出中序遍歷序列的下一個節點?樹中的節點除了左右子節點外,還包含父節點。 思路: 節點分為有右子樹和沒有右子樹兩大類: 如果節點有右子樹,那麼它的下一個節點為它右子樹的最左節點 如果節點沒有右子樹,也可以分為兩類:(程

offer——試題25中和為某一值的路徑

void FindPath(BinaryTreeNode* pRoot, int expectedSum) { if(pRoot == NULL) return;

offer--試題19的映象--Java實現

題目描述: 請完成一個函式,輸入一個二叉樹,該函式輸出它的映象。 解題思路: 我們先前序遍歷這棵樹的每個結點,如果這個結點有子結點,就交換它的兩個子結點。當交換完所有非葉子結點的左右子結點後,就得到了樹的映象。 這裡採用了遞迴方式和非遞迴方式。

試題63搜尋K節點

      題目:給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。 struct TreeNode {

試題63搜尋的的k結點

/* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) {

offer62 尋找搜尋k結點

題目 原題目是:給定一顆二叉搜尋樹,請找出其中的第k大的結點。 但是,看到網上那麼多人給出的答案後,我認為是尋找第k個結點,而不是第k大的節點。 思路 我們知道,二叉搜尋樹的特點:左子樹的節點的值均比父節點小,右子樹的節點的值均比父節點的值大。所以,我們中序遍歷二叉搜尋樹,就可以

leetcode 240. 搜尋維矩陣 II【陣列】【Medium】&&Offer試題4維陣列中的查詢

題目: 編寫一個高效的演算法來搜尋 m x n 矩陣 matrix 中的一個目標值 target。該矩陣具有以下特性: 每行的元素從左到右升序排列。 每列的元素從上到下升序排列。 示例: 現有矩陣 matrix 如下: [

offer試題維陣列中的查詢

  題目描述 思路一:遍歷整個二維陣列 思路二:利用該二維陣列的特性(時間複雜度為O(n),因為每次比較都會去掉一行或一列) 思路三:二分法   題目描述 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一

Offer學習】【試題27搜尋與雙向連結串列】

題目:輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。 比如輸入圖4.12 中左邊的二叉搜尋樹,則輸出轉換之後的排序現向連結串列。 結點定義: public static

offer試題33搜尋的後序遍歷序列

題目:輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回 true,否則返回 false。假設輸入的陣列的任意兩個數字都互不相同。 牛客網連結: https://blog.csdn.net/jsqfengbao/article/details/4

offer試題36搜尋與雙向連結串列

題目:輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。  比如如下圖中的二叉搜尋樹,則輸出轉換之後的排序雙向連結串列為:  在二叉樹中,每個結點都有兩個指向子節點的指標。在雙向連結串