二叉搜尋樹的第k個節點(java版)
【題目描述】給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。
【解題思路1】
//1. 二叉搜素樹的中序遍歷訪問佇列,自然的滿足升序排序的條件。
//2. 中序遍歷二叉搜尋樹,暫存輸出佇列。
//3. 從儲存的輸出佇列中找到滿足條件的值。
import java.util.ArrayList;
public class Solution {
ArrayList<TreeNode> arr = new ArrayList<TreeNode>();
TreeNode KthNode(TreeNode pRoot, int k)
{
if(pRoot==null|| k==0){
return null;
}
inOrder(pRoot);
TreeNode tr = pRoot;
if(k<=arr.size()){
tr = arr.get(k-1);
}else{
return null;
}
return tr;
}
public void inOrder(TreeNode root){
if (root ==null){
return;
}
if(root.left != null){
inOrder(root.left);
}
arr.add(root);
if(root.right != null){
inOrder(root.right);
}
}
}
【解題思路2】
//1. 改進思路1,不再暫存所有輸出。
//2. 改為設定一個計數器。中序遍歷過程中,累加計算訪問過的節點數目,當計數器等於要求的k時,則返回該節點。
public class Solution {
int index = 0; //計數器
TreeNode KthNode(TreeNode root, int k)
{
if(root != null){ //中序遍歷尋找第k個
TreeNode node = KthNode(root.left,k);
if(node != null)
return node;
index ++;
if(index == k)
return root;
node = KthNode(root.right,k);
if(node != null)
return node;
}
return null;
}
}
【解題思路3】
//1. 中序遍歷非遞迴
import java.util.Stack;
public class Solution {
int count = 0;
TreeNode KthNode(TreeNode pRoot, int k)
{
if(count > k || pRoot == null)
return null;
TreeNode p = pRoot;
Stack<TreeNode> LDRStack = new Stack<TreeNode>();
TreeNode kthNode = null;
while(p != null || !LDRStack.isEmpty()){
while(p != null){
LDRStack.push(p);
p = p.left;
}
TreeNode node = LDRStack.pop();
System.out.print(node.val+",");
count++;
if(count == k){
kthNode = node;
break;
}
p = node.right;
}
return kthNode;
}
}
相關推薦
二叉搜尋樹的第k個節點(java版)
【題目描述】給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。 【解題思路1】 //1. 二叉搜素樹的中序遍歷訪問佇列,自然的滿足升序排序的條件。 //2.
劍指offer62 尋找二叉搜尋樹第k個結點
題目 原題目是:給定一顆二叉搜尋樹,請找出其中的第k大的結點。 但是,看到網上那麼多人給出的答案後,我認為是尋找第k個結點,而不是第k大的節點。 思路 我們知道,二叉搜尋樹的特點:左子樹的節點的值均比父節點小,右子樹的節點的值均比父節點的值大。所以,我們中序遍歷二叉搜尋樹,就可以
在單鏈表中刪除倒數第k個節點(java實現)
實現方式很多,在這裡只說兩種實現方式。看不懂時候,大家可以畫畫圖,對理解為什麼很有幫助。 第一種方式: 1.首先判斷K值和連結串列是否為空,如果k<=0,或連結串列為空,直接返回head; 2.滿足上面條件後,定義ListNode P=head,重頭
輸出單鏈表中倒數第k個結點(Java版)
題目:輸入帶頭結點的單鏈表L,輸出該單鏈表中倒數第k個結點。單鏈表的倒數第0個結點為該單鏈表的尾指標。要求只能遍歷一次單鏈表。 解題思路: 如果不要求只能遍歷一次單鏈表,我們可以先遍歷一次單鏈表
二叉搜尋樹的第k個結點(Java實現)
本題為劍指offer面試題63 [程式設計題]二叉搜尋樹的第k個結點 熱度指數:40095 時間限制:1秒 空間限制:32768K 給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 5
二叉搜尋樹第K小元素
1.思路:迭代法 計算出二叉樹左節點的個數,如果左節點的個數等於k-1;則根節點就是我們要找的值,如果左節點的個數大於k-1,表明我們要查詢的第k個最小元素在左子樹中,如果左節點的個數小於k-1,表明要查詢的第k個最小元素在右子節點中,找到右子樹中第k-count(left
Leetcode 230.二叉搜尋樹第k小的數
二叉搜尋樹第k小的數 給定一個二叉搜尋樹,編寫一個函式 kthSmallest 來查詢其中第 k 個最小的元素。 說明:你可以假設 k 總是有效的,1 ≤ k ≤ 二叉搜尋樹元素個數。 示例 1: 輸入: root = [3,1,4,null,2], k
《劍指offer》系列 二叉搜尋樹與雙向連結串列(Java)
連結 牛客: 二叉搜尋樹與雙向連結串列 題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。 思路 這個程式碼是借鑑網上的,整體結構和中序遍歷非常類似,只不過將原本輸出那部分的操作換成了改變結
《劍指offer》系列 二叉搜尋樹與雙向連結串列(Java)
連結 題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。 思路 這個程式碼是借鑑網上的,整體結構和中序遍歷非常類似,只不過
劍指offer:二叉搜尋樹與雙向連結串列(java)
題目:輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立新的結點,只能調整樹中結點指標的指向。 比如如下圖中的二叉搜尋樹,則輸出轉換之後的排序雙向連結串列為: 由於要求轉換之後的連結串列是排好序的,我們可以中序遍歷樹的每一個結點,
一:單鏈表——③查詢倒數第k個節點(O(1))
製作人 :TheShyclear 製作時間:2018-7-21 製作內容:查詢單鏈表中的倒數第k個數據 版本號 :8.0 缺陷:頭節點只能插入一次,不能在1號節點出插入,詳細看Insert函式 注意:頭指標的不可改變性 思路:單鏈表中的許多問題需要用到兩個指
劍指offer第二版面試題36:二叉搜尋樹與雙向連結串列(java)
題目描述: 輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立新的結點,只能調整樹中結點指標的指向。 比如如下圖中的二叉搜尋樹,則輸出轉換之後的排序雙向連結串列為: 分析: 在二叉樹中,每個結點都有兩個指向子節點的指標。在雙
常見連結串列操作-刪除連結串列倒數第n個節點(JAVA實現)
問題 給出一個單向連結串列,刪除該連結串列倒數第n個節點,並返回頭節點。 例如: 給出連結串列 1->2->3->4->5,n=2 返回連結串列 1->2->3->5 解題思路 最容易想到的演算法: 先遍歷一次連結串列,
leetcode連結串列題--刪除連結串列的倒數第N個節點(java實現)
原題 給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。 示例: 給定一個連結串列: 1->2->3->4->5, 和 n = 2. 當刪除了
二叉搜尋樹的最小節點絕對值之差/在二叉查詢樹中尋找兩個節點,使它們的和為一個給定值/找出 BST 中的所有眾數(出現頻率最高的元素)。
關於二叉樹的數值運算,一般考慮借用中序遍歷為陣列;再進行計算的思想。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; *
找出二叉搜尋樹的最大節點和最小節點
problem:Write recursive versions of TREE-MINIMUM and TREE-MAXIMUM. typedef struct BiTNode { int data; struc
滿二叉排序樹任意三個節點最近公共父節點
#include <iostream> using namespace std; int tree[1024*1024]; int k; int a,b,c; int power2(int n) { int i=1; int j; fo
給定二叉搜尋樹和兩個整數A,B (最小整數和最大整數)。如何刪除不在該區間內的元素(剪枝)
由於需要檢查樹中的每一個元素,結點的處理順序可以是從葉子結點到根結點。這樣當處理到結點本身時,其左子樹和右字樹為有效剪枝的BST。 static BianrySearchTreeNode PruneB
劍指Offer 26. 二叉搜尋樹與雙向連結串列 (二叉搜尋樹)
題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。 題目地址 https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=1
劍指Offer-26.二叉搜尋樹與雙向連結串列(Javascript)
26.二叉搜尋樹與雙向連結串列 題目連結 題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。 解題思路 因為要對二叉搜