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