参考「エコー」牛オフの答え:https://www.nowcoder.com/questionTerminal/ef068f602dde4d28aab2b210e859150a?f=discussion
アイデアの分析:
まず、前順でのバイナリツリーの検索結果を注文さを理解しています。前順トラバーサル、NUM ++内のノードにグローバル変数のレコードをnum回、各時間を設定します。numはKに等しい場合、すなわち、ノードは、結果を返します。
再帰のハード
タイトル説明
二分探索木を考えると、その中の最初のk小さいノードを検索してください。例えば、(5,3,7,2,4,6,8)と、第3の接続点に係る数値は、4要約です。
主エコー参照コード:
public class Solution {
int num=1;
TreeNode KthNode(TreeNode pRoot, int k)
{
if(pRoot==null||k<1){
return null;
}else{
TreeNode left=KthNode(pRoot.left,k);
if(left!=null){//为什么会判断是否为null,是因为只有当num等于k时才会返回结点,其他情况只返回null,因为第k小只有一个。
return left;
}
if(num==k){
return pRoot;
}
num++;
TreeNode right=KthNode(pRoot.right,k);
if(right!=null){
return right;
}
}
return null;//num不等于k时,只返回null。
}
}
独自のアイデアコード:
私のコードは戻り結果に終わったすべてを横断、上記よりも効率が低いです。
public class Solution {
int num=1;
TreeNode res=null;//用来保存唯一的结果
TreeNode KthNode(TreeNode pRoot, int k)
{
if(pRoot==null||k<1){
return null;
}
TreeNode left=KthNode(pRoot.left,k);
if(num==k){
res= pRoot;
}
num++;
TreeNode right=KthNode(pRoot.right,k);
return res;//找到第k小之前,谁调用我都返回null,找到第k小之后,谁调用我都返回第k小结点
}
}