[アルゴリズムの設計と分析(クラス後の回答)]リスト/ツリーの再帰

1

先行ノードのない単一リンクリストLの場合、再帰的アルゴリズムは、すべてのノード値を正の順序で出力するように設計されています。

public class Solution1 {
    
    
    public void printL(ListNode node) {
    
    
        if (node == null) {
    
    
            return;
        }
        System.out.println(node.val);
        printL(node.next);
    }
}

2

先行ノードのない単一リンクリストLの場合、再帰的アルゴリズムは、すべてのノード値を逆の順序で出力するように設計されています。

public class Solution2 {
    
    
    public void printL(ListNode node) {
    
    
        if (node == null) {
    
    
            return;
        }
        printL(node.next);
        System.out.println(node.val);
    }
}

3

先行ノードのない空でない単一リンクリストLの場合、最大のノードのアドレスを返す再帰的アルゴリズムを設計します(そのようなノードが一意であると仮定します)。

public class Solution3 {
    
    
    public ListNode findMax(ListNode node) {
    
    
        if (node.next == null) {
    
    
            return node;
        }
        return node.val > findMax(node.next).val ? node : findMax(node.next);
    }
}

4

先行ノードのない単一リンクリストLの場合、再帰アルゴリズムは、値がxである最初のノードのアドレスを返すように設計されています。そのようなノードがない場合はnullを返します。

public class Solution4 {
    
    
    public ListNode findNode(ListNode node, int target) {
    
    
        if (node == null) {
    
    
            return null;
        }
        if (node.val == target) {
    
    
            return node;
        }
        return findNode(node.next, target);
    }
}

5

先行ノードのない単一リンクリストLの場合、再帰アルゴリズムは、値がxである最初のノードを削除するように設計されています。

public class Solution5 {
    
    

    /**
     * 虽说是递归,本质还是双/三指针的向右滑动
     * 设置一个dummy头结点很有必要
     */
    public void deleteNode(ListNode head, int target) {
    
    
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        delete(dummy, head, target);
    }


    private void delete(ListNode pre, ListNode node, int target) {
    
    
        if (node == null) {
    
    
            return;
        }
        if (node.val == target) {
    
    
            pre.next = node.next;
            return;
        }
        delete(node, node.next, target);
    }
}

6

二分木が二分木ストレージ構造に格納され、ノード値がint型であると仮定すると、再帰アルゴリズムは、二分木bt内のすべてのリーフノードの合計を見つけるように設計されています。

public class Solution6 {
    
    
    public int nodeSum(TreeNode node) {
    
    
        if (node == null) {
    
    
            return 0;
        }
        if (node.left == null && node.right == null) {
    
    
            return node.val;
        }
        return nodeSum(node.left) + nodeSum(node.right);
    }
}

7

二分木が二分木ストレージ構造に格納され、ノード値がint型であると仮定すると、再帰アルゴリズムは、ノード値がk以上である二分木bt内のノードの数を見つけるように設計されています。

public class Solution7 {
    
    
    public int countNode(TreeNode node, int k) {
    
    
        if (node == null) {
    
    
            return 0;
        }
        return (node.val >= k ? 1 : 0) + countNode(node.left, k) + countNode(node.right, k);
    }
}

8

バイナリツリーがバイナリチェーンストレージ構造に格納されており、すべてのノード値が異なると仮定して、再帰的アルゴリズム値x(ノードレベル1)でノードレベルを設計し、そのようなノードが見つからない場合は0を返します。

public class Solution8 {
    
    
    public int findLayerOfK(TreeNode node, int k, int level) {
    
    
        if (node == null) {
    
    
            return 0;
        }
        if (node.val == k) {
    
    
            return level;
        }
        int t1 = findLayerOfK(node.left, k, level + 1);
        int t2 = findLayerOfK(node.right, k, level + 1);
        return t1 != 0 ? t1 : t2;
    }
}

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

⭐️これは、ネットワーク全体で最も美しいJavaソリューションである必要があります> _ <

おすすめ

転載: blog.csdn.net/m0_46202073/article/details/115040965