1. 程式人生 > >二叉搜尋樹的第k個節點(java版)

二叉搜尋樹的第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.二叉搜尋樹與雙向連結串列 題目連結 題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。 解題思路 因為要對二叉搜