1. 程式人生 > >劍指offer(C++)——二叉搜尋樹的第k個結點

劍指offer(C++)——二叉搜尋樹的第k個結點

題目描述

給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 
按結點數值大小順序第三個結點的值為4。 思路:根據二叉搜尋樹的特點,中序遍歷的數值是遞增排序的,因此,只需中序遍歷二叉搜尋樹就能找到第k大結點。 如上面的二叉樹,中序遍歷結果為 {2,3,4,5,6,7,8},第三個結點的值為4
/*思路:根據二叉搜尋樹的特點,中序遍歷的數值是遞增排序的,因此,只需中序遍歷二叉搜尋樹就能找到第k大結點*/
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
	TreeNode* KthNode(TreeNode* pRoot, int k)
	{
		if (pRoot == NULL || k <= 0)
			return NULL;
		return kthnode(pRoot, k);
	}
	TreeNode* kthnode(TreeNode* pRoot, int& k)          //中序遍歷查詢第k個結點
	{
		TreeNode* target = NULL;
		if (pRoot->left != NULL)
			target  = kthnode(pRoot->left, k);
		if (target == NULL)
		{
			if (k == 1)
				target = pRoot;
			--k;
		}
		if (pRoot->right&&target == NULL)
			target = kthnode(pRoot->right, k);
		return target;
	}
};


相關推薦

offerC++——搜尋k結點

題目描述 給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如,  按結點數值大小順序第三個結點的值為4。 思路:根據二叉搜尋樹的特點,中序遍歷的數值是遞增排序的,因此,只需中序遍歷二叉搜

offer——24搜尋的後序遍歷序列

public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if(sequence.length==0) return false; if(sequence.lengt

offer——20搜尋k結點

最近作業好多 幾門結課作業一起來 很煩啊  中序遍歷二叉搜尋樹得到的就是升序的結點排列,遍歷的時候加個判斷是不是第k個結點就行了。  /* public class TreeNode { int val = 0; TreeNode left =

offer62 尋找搜尋k結點

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

offer57的下一個節點

需要 div 2種 color 節點 兩種 我們 cti 指向 題目描述 給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。註意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。 題目分析 這題一定要畫圖,因為只有畫圖我們才能分清楚下一個節

offer62搜索K節點

它的 spa cti pan class 們的 得到 style 例如 題目描述 給定一棵二叉搜索樹,請找出其中的第k小的結點。例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值為4。 題目分析 首先,我們可以先畫圖。畫完圖後我們要想辦法

offer——14的映象交換

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

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

參考題解: 牛客網 深度優先搜尋(DFS):此題解中,程式執行找到[10, 5, 4]後,4為葉子節點了,remove掉4,變為[10, 5],這時執行if(root.right != null) FindPath(root.right,target); 找到[10, 5,

offer20搜索與雙向表

定義 節點 line null set nod 轉換成 number oot 題目:     輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。 思路一:遞歸法  1.將左子樹構造成雙鏈表,並返回鏈表頭節

offer】Java實現-搜尋k結點

題目描述 給定一棵二叉搜尋樹,請找出其中的第k小的結點。例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值為4。 思路 二叉搜尋樹-BST(又二叉查詢樹,二叉排

offer{23-24}】搜尋的後序遍歷序列、中和為某一值的路徑

二叉搜尋樹的後序遍歷序列、二叉樹中和為某一值的路徑 二叉搜尋樹的後序遍歷序列 題目描述 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣

Offer面試題33搜尋的後序遍歷序列java版

題目:輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。 分析:在後序遍歷序列中,最後一個數字是樹的根節點的值。陣列中前面的數字可以分為兩部分:第一部分是左子樹節點的值,它

offer--面試題27:搜尋與雙向連結串列--Java實現

題目描述: 輸入一顆二叉搜尋樹,將二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。 思路: 原先指向左子結點的指標調整為連結串列中指向前一個結點的指標,原先指向右子結點的指標指向為連結串列中指向後一個結點的指標

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

解題思路: 1.判定一個序列是不是某二叉搜尋樹的後續遍歷序列,可以結合二叉樹的後續序列和二叉搜尋樹的特點來判斷。二叉樹的後續遍歷序列,其最後一個數字是樹的根節點的值,根節點的前面部分可以分為左子樹的序列和右子樹的序列。而這顆二叉樹需要是一顆二叉搜尋樹,又必須滿足左子樹上的所

offer-面試題63-搜尋k結點

二叉樹節點定義: package case63_KthNodeOfBST; /** * 二叉搜尋樹的結點結構定義 * * @author WangSai * */ public class MyNode { int data; MyNode lchild;

offer-題63:搜尋k結點

題目描述 給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。 實驗平臺:牛客網 解決思路:

Offer》題目:鏈表中倒數k結點

倒數 -- 輸出 col ota pan code 輸入 tno 題目描述:輸入一個鏈表,輸出該鏈表中倒數第k個結點 題目分析:因為不能直接從鏈表的尾部遍歷,所以要分兩步走: 第一步:從鏈表的頭部開始遍歷,直至鏈表的尾部,統計出鏈表結點的個數 第二步:根據鏈表結點的個數,計

offer編程-鏈表中倒數k結點

描述 節點 thead 註意 功能測試 判斷 tro return 測試用例 題目描述 輸入一個鏈表,輸出該鏈表中倒數第k個結點。 思路: 1.遍歷鏈表得到鏈表的長度l,找到從前往後的第l-k+1個節點。需要遍歷兩遍。 2.遍歷一次即可的方法:兩個指針,第一個指針從頭向尾

offer十四之鏈表中倒數k結點

gif img https question pla last 代碼 鏈表 || 一、題目 輸入一個鏈表,輸出該鏈表中倒數第k個結點。 二、思路   兩個指針,先讓第一個指針和第二個指針都指向頭結點,然後再讓第一個指正走(k-1)步,到達第k個節點。然後兩個指針同

offer刷題之連結串列中倒數k結點

題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 # -*- coding:utf-8 -*- # class ListNode: #     def __init__(self, x): #         s