二分木の基本問題と解法

一、100. 同じ木の判定

1. 問題概要

二つの二分木の根ノード p と q が与えられたとき、これらの木が同じであるかどうかを検証する関数を記述してください。
2つの木が構造的に同じで、かつノードの値が同じである場合、それらは同じであると見なされます。

2. コード

class BinaryTreeChecker {
    public boolean areTreesIdentical(TreeNode node1, TreeNode node2) {
        if (node1 == null && node2 == null) {
            return true; // 両方ともnull
        } else if (node1 == null || node2 == null) {
            return false; // 片方がnull
        } else if (node1.value != node2.value) {
            return false; // 根ノードの値が異なる
        } else {
            return areTreesIdentical(node1.leftChild, node2.leftChild) && 
                   areTreesIdentical(node1.rightChild, node2.rightChild); // 左右の子ノードを比較
        }
    }
}

二、572. 他の木の部分木

1. 問題概要

二つの二分木 root と subRoot が与えられます。root が subRoot と同じ構造とノード値を持つ部分木を含んでいるかどうかを検証してください。存在する場合は true を返し、そうでない場合は false を返します。
二分木 tree の部分木は、tree のあるノードとそのすべての子孫ノードを含みます。tree 自身もその部分木の1つと見なされます。

2. コード

class SubtreeChecker {
    public boolean containsSubtree(TreeNode mainTree, TreeNode subTree) {
        if (subTree == null) return true;
        if (mainTree == null) return false;
        return containsSubtree(mainTree.leftChild, subTree) || 
               containsSubtree(mainTree.rightChild, subTree) || 
               areTreesIdentical(mainTree, subTree);
    }
    
    private boolean areTreesIdentical(TreeNode node1, TreeNode node2) {
        if (node1 == null && node2 == null) {
            return true;
        } else if (node1 == null || node2 == null) {
            return false;
        } else if (node1.value != node2.value) {
            return false;
        } else {
            return areTreesIdentical(node1.leftChild, node2.leftChild) && 
                   areTreesIdentical(node1.rightChild, node2.rightChild);
        }
    }
}

三、226. 二分木の反転

1. 問題概要

二分木の根ノード root が与えられたとき、この木を反転し、その根ノードを返してください。

2. コード

class TreeInverter {
    public TreeNode invertBinaryTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        TreeNode temporary = root.leftChild;
        root.leftChild = root.rightChild;
        root.rightChild = temporary;

        invertBinaryTree(root.leftChild);
        invertBinaryTree(root.rightChild);

        return root;
    }
}

四、110. バランスされた二分木

1. 問題概要

与えられた二分木がバランスされているかどうかを判断してください。(バランスされた二分木とは、すべてのノードの左右の部分木の深さの差が1以下である木です)

2. コード

class BalancedTreeChecker {
    public boolean isBalanced(TreeNode root) {
        if (root == null) {
            return true;
        } else {
            return Math.abs(getHeight(root.leftChild) - getHeight(root.rightChild)) <= 1 && 
                   isBalanced(root.leftChild) && 
                   isBalanced(root.rightChild);
        }
    }
    
    private int getHeight(TreeNode node) {
        if (node == null) {
            return 0;
        } else {
            return Math.max(getHeight(node.leftChild), getHeight(node.rightChild)) + 1;
        }
    }
}

タグ: 二分木 Java データ構造 アルゴリズム LeetCode問題

5月19日 19:29 投稿