ツリー内のK番目に小さいノードを見つけるための二叉探索ツリー(BST)が与えられる
3500 ワード
タイトル:ツリーのK番目の小さなノードを見つけるために、二叉検索ツリー(BST)を指定します。
*考察点
*例 5
/ \
3 6
/ \
2 4
/
1
説明:入力Kが1<=K<=(ノード数)を満たすことを保証する
木に関する問題は,一目で再帰的に解き,左右の子木がそれぞれ遍歴することを考える.二叉探索ツリーの性質を連想し、rootが左サブツリーより大きく、右サブツリーより小さく、左サブツリーのノード数がK-1に等しい場合、rootは結果であり、そうでない場合、左サブツリーのノード数がK-1より小さい場合、結果は必ず右サブツリーにあり、そうでない場合、左サブツリーにある.したがって,探索時に同時にノード数を返し,Kと比較すると結果が得られる./**
* Definition for a binary tree node.
**/
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class Solution {
private class ResultType {
boolean found; //
int val; //
ResultType(boolean found, int val) {
this.found = found;
this.val = val;
}
}
public int kthSmallest(TreeNode root, int k) {
return kthSmallestHelper(root, k).val;
}
private ResultType kthSmallestHelper(TreeNode root, int k) {
if (root == null) {
return new ResultType(false, 0);
}
ResultType left = kthSmallestHelper(root.left, k);
// ,
if (left.found) {
return new ResultType(true, left.val);
}
// = K-1, root
if (k - left.val == 1) {
return new ResultType(true, root.val);
}
//
ResultType right = kthSmallestHelper(root.right, k - left.val - 1);
if (right.found) {
return new ResultType(true, right.val);
}
// ,
return new ResultType(false, left.val + 1 + right.val);
}
}
二叉探索ツリーを指定し、関数kthSmallestを記述してk番目の最小要素を検索します。
説明:kは常に有効であり、1≦k≦二叉探索ツリー要素の個数であると仮定できます.
例1:
入力:root=[3,1,4,null,2],k=1
3
/ \
1 4
\
2
出力:1
例2:
入力:root=[5,3,6,2,4,null,null,1],k=3
5
/ \
3 6
/ \
2 4
/
1
出力:3ステップ:二叉検索ツリーが頻繁に変更(挿入/削除操作)され、k番目の小さな値を頻繁に検索する必要がある場合、kthSmallest関数を最適化するにはどうすればいいですか?中間パスの使用
class Solution {
List list = new ArrayList();
public void dfs(TreeNode root){
if(root == null)
return ;
dfs(root.left);
list.add(root.val);
dfs(root.right);
}
public int kthSmallest(TreeNode root, int k) {
dfs(root);
for(int i=0;i
再帰(ノード数の計算)を使用します。
class Solution {
public int count(TreeNode root){
if(root == null)
return 0;
return 1 + count(root.left) + count(root.right);
}
public int kthSmallest(TreeNode root, int k) {
int num = count(root.left);
if(num == k-1)
return root.val;
if(num > k-1)
return kthSmallest(root.left,k);
return kthSmallest(root.right,k - num-1);
}
}
参照リンク:
https://blog.csdn.net/xuchonghao/article/details/80770490
https://github.com/debitCrossBlockchain/interview__reference/blob/master/01.%E9%98%BF%E9%87%8C%E7%AF%87/1.1.3%20%E7%BB%99%E5%AE%9A%E4%B8%80%E4%B8%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91(BST)%EF%BC%8C%E6%89%BE%E5%88%B0%E6%A0%91%E4%B8%AD%E7%AC%AC%20K%20%E5%B0%8F%E7%9A%84%E8%8A%82%E7%82%B9.md
5
/ \
3 6
/ \
2 4
/
1
/**
* Definition for a binary tree node.
**/
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class Solution {
private class ResultType {
boolean found; //
int val; //
ResultType(boolean found, int val) {
this.found = found;
this.val = val;
}
}
public int kthSmallest(TreeNode root, int k) {
return kthSmallestHelper(root, k).val;
}
private ResultType kthSmallestHelper(TreeNode root, int k) {
if (root == null) {
return new ResultType(false, 0);
}
ResultType left = kthSmallestHelper(root.left, k);
// ,
if (left.found) {
return new ResultType(true, left.val);
}
// = K-1, root
if (k - left.val == 1) {
return new ResultType(true, root.val);
}
//
ResultType right = kthSmallestHelper(root.right, k - left.val - 1);
if (right.found) {
return new ResultType(true, right.val);
}
// ,
return new ResultType(false, left.val + 1 + right.val);
}
}
3
/ \
1 4
\
2
入力:root=[5,3,6,2,4,null,null,1],k=3
5
/ \
3 6
/ \
2 4
/
1
出力:3ステップ:二叉検索ツリーが頻繁に変更(挿入/削除操作)され、k番目の小さな値を頻繁に検索する必要がある場合、kthSmallest関数を最適化するにはどうすればいいですか?中間パスの使用
class Solution {
List list = new ArrayList();
public void dfs(TreeNode root){
if(root == null)
return ;
dfs(root.left);
list.add(root.val);
dfs(root.right);
}
public int kthSmallest(TreeNode root, int k) {
dfs(root);
for(int i=0;i
再帰(ノード数の計算)を使用します。
class Solution {
public int count(TreeNode root){
if(root == null)
return 0;
return 1 + count(root.left) + count(root.right);
}
public int kthSmallest(TreeNode root, int k) {
int num = count(root.left);
if(num == k-1)
return root.val;
if(num > k-1)
return kthSmallest(root.left,k);
return kthSmallest(root.right,k - num-1);
}
}