安全Offer62を証明:k番目のノードのバイナリ検索ツリー(ジャワ)

参考「エコー」牛オフの答え: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小结点
    }
}

おすすめ

転載: www.cnblogs.com/dongmm031/p/12342282.html
おすすめ