Day31——二分木の話題


25. 二分探索木のモード

トピック リンク: 501. 二分探索ツリーの適度な数 - LeetCode

アイデア: 二分探索木の特徴を利用し、順序走査を使用します。二分探索数の性質が解決されます (2 つのポインターが現在のノードと前のノード、カウント、更新などを比較します)。

コード実装のアイデア:

class Solution {
    
    
    List<Integer> list = new ArrayList<>();
    int pre = -1;
    int count = 0;
    int Maxcount = 0;
    public int[] findMode(TreeNode root) {
    
    
        dfs(root);
        int[] res = new int[list.size()];
        for(int i = 0;i<list.size();i++){
    
    
            res[i] = list.get(i);
        }
        return res;
    }
    public void dfs(TreeNode root){
    
    
        if(root==null){
    
    
            return ;
        }
        //向左遍历
        dfs(root.left);
        if(root.val==pre){
    
    
            count++;
        }else{
    
    
            count = 1;
        }
        pre = root.val;
        if(count==Maxcount){
    
    
            list.add(root.val);
        }else if(count>Maxcount){
    
    
            Maxcount = count;
            list.clear();
            list.add(root.val);
        }
        dfs(root.right);
    }
}

26. 二分木の最も近い共通の祖先

トピック リンク: 236. 二分木の最も近い共通の祖先 - LeetCode

アイデア: dfs ポストオーダー トラバーサル、共通の祖先を下から上に検索する

  1. 最小の共通の祖先を見つけるには、ボトムアップからトラバーサルする必要があるため、バイナリ ツリーは、ポストオーダー トラバーサル (つまり、バックトラッキング) によって下位から上位にのみトラバースできます。
  2. バックトラックの過程では、二分木全体をトラバースする必要があります. 結果が見つかったとしても、再帰関数の戻り値 (つまり、コードの左と右) が異なるため、他のノードをトラバースする必要があります.論理的な判断に使用する必要があります。
class Solution {
    
    
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    
    
        return dfs(root,p,q);
    }
    public TreeNode dfs(TreeNode root,TreeNode p,TreeNode q){
    
    
        if(root==null||root==p||root==q){
    
    
            return root;
        }
        //后序遍历
        TreeNode left = dfs(root.left,p,q);
        TreeNode right = dfs(root.right,p,q);
        if(left==null&&right==null){
    
    
            return null;
        }
        else if(right!=null&&left==null){
    
    
            return right;
        }
        else if(right==null&&left!=null){
    
    
            return left;
        }
        else{
    
    
            return root;
        }
    }
}

27. 最も近い共通の祖先の二分探索木

トピック リンク: 235. 二分探索木の最も近い共通祖先 - LeetCode

アイデア: 二分探索木の性質を利用する: 左のサブツリーの値はルートよりも小さく、右のサブツリーの値はルートよりも大きいため、検索の方向を決定できます。 !

  • root現在のルート ノードの値がq pより大きい場合、p q最も近い共通ノードは左側のサブツリーにあり、左側のサブツリーをたどることができます。
  • root現在のルート ノードの値がq pより小さい場合、p q最も近い共通ノードは右側のサブツリーにあり、左側のサブツリーをたどることができます。
  • p qそれぞれが現在のroot左右のサブツリーにあり、現時点でroot最も近い共通の祖先です

コード:

再帰的方法:

class Solution {
    
    
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    
    
        return dfs(root, p, q);
    }
    public TreeNode dfs(TreeNode root, TreeNode p, TreeNode q){
    
    
        if(root==null){
    
    
            return null;
        }
        if(root.val>p.val&&root.val>q.val){
    
    
            return dfs(root.left,p,q);
        }else if(root.val<p.val&&root.val<q.val){
    
    
            return dfs(root.right,p,q);
        }
        return root;
    }
}

反復法:

class Solution {
    
    
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    
    
        while(true){
    
    
            if(root.val>p.val&&root.val>q.val){
    
    
                root = root.left;
            }
            else if(root.val<p.val&&root.val<q.val){
    
    
                root = root.right;
            }else{
    
    
                break;
            }
        }
        return root;
    }
}

おすすめ

転載: blog.csdn.net/weixin_54040016/article/details/127842493