二分木の演習問題の一部

同じ木

リンク:同じツリー
ここに画像の説明を挿入
アイデア:最初にルートノードが同じであるかどうか、異なる場合はfalseであるかどうかを判断し、次に左側のサブツリーと右側のサブツリーを判断します

class Solution {
    
    
    public boolean isSameTree(TreeNode p, TreeNode q) {
    
    
        if (p == null && q == null) {
    
    
            return true;
        }
        if (p == null || q == null) {
    
    
            return false;
        }
        if (p.val!=q.val){
    
    
            return false;
        }

        if (!isSameTree(p.left, q.left)) {
    
    
            return false;
        }
        return isSameTree(p.right, q.right);
    }
}

別のツリーのサブツリー

リンク:別のツリーのサブツリー
ここに画像の説明を挿入
アイデア:ツリーがルートノードから同じであるかどうかを判断し、次に左側のサブツリー、右側のサブツリーを順番に決定します。

class Solution {
    
    
    public boolean isSubtree(TreeNode s, TreeNode t) {
    
    
        if(s==null){
    
    
            return false;
        }
        if (isSameTree(s, t)) {
    
    
            return true;
        }
        if (isSubtree(s.left, t)) {
    
    
            return true;
        }
        return isSubtree(s.right, t);
    }

    public boolean isSameTree(TreeNode p, TreeNode q) {
    
    
        if (p == null && q == null) {
    
    
            return true;
        }
        if (p == null || q == null) {
    
    
            return false;
        }
        return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
    }
}

二分木の最大深さ

リンク:リンクの説明を追加する
ここに画像の説明を挿入
アイデア:バイナリツリーの高さを見つけ、左側のサブツリーと右側のサブツリーを見つけてから、より高い高さに戻り、ルートノードを追加します。

class Solution {
    
    
    public int maxDepth(TreeNode root) {
    
    
        if (root == null) {
    
    
            return 0;
        }
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);

        return Integer.max(left, right) + 1;
    }
}

平衡二分木

リンク:平衡二分木
ここに画像の説明を挿入
アイデア:二分木の各ノードの左側のサブツリーの高さと右側のサブツリーの高さを取得し、差の絶対値が要件を満たしているかどうかを判断します

class Solution {
    
    
    public boolean isBalanced(TreeNode root) {
    
    
        if (root == null) {
    
    
            return true;
        }
        int left = getHeight(root.left);
        int right = getHeight(root.right);
        int diff = Math.abs(left - right);
        if (diff > 1) {
    
    
            return false;
        }
        if (!isBalanced(root.left)) {
    
    
            return false;
        }
        return isBalanced(root.right);

    }

    private int getHeight(TreeNode root) {
    
    
        if (root == null) {
    
    
            return 0;
        }
        int left = getHeight(root.left);
        int right = getHeight(root.right);
        return Integer.max(left, right) + 1;
    }
}

対称二分木

リンク:対称二分木
ここに画像の説明を挿入
アイデア:左サブツリーの左の子と右の子が右のサブツリーの右の子と左の子と等しいかどうかを判断して、対称であるかどうかを判断できるようにします。

class Solution {
    
    
    public boolean isSymmetric(TreeNode root) {
    
    
        if (root == null) {
    
    
            return true;
        }
        return isSame(root.left, root.right);
    }

    public boolean isSame(TreeNode p, TreeNode q) {
    
    
        if (p == null && q == null) {
    
    
            return true;
        }
        if (p == null || q == null) {
    
    
            return false;
        }
        if (p.val != q.val) {
    
    
            return false;
        }
        if (!isSame(p.left, q.right)) {
    
    
            return false;
        }
        return isSame(p.right, q.left);
    }
}

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

リンク:バイナリツリーの最も近い共通の祖先
ここに画像の説明を挿入
アイデア:2つのノードの位置を決定します。一方が左でもう一方が右の場合、それはルートノードです。同じサブツリーの下にある場合は、再帰的に検索を続行します。 。

class Solution {
    
    
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    
    
        if (root == p || root == q) {
    
    
            return root;
        }
        boolean pindex = contains(root.left, p);
        boolean qindex = contains(root.left, q);
        if (pindex && !qindex) {
    
    
            //p在左子树,q不在
            return root;
        }
        if (qindex && !pindex) {
    
    
            //q在左子树,p不在
            return root;
        }
        if (pindex) {
    
    
            //p、q在左子树,
            return lowestCommonAncestor(root.left, p, q);
        } else {
    
    
            return lowestCommonAncestor(root.right, p, q);
        }
    }

    public boolean contains(TreeNode root, TreeNode node) {
    
    
        if (root == null) {
    
    
            return false;
        }
        if (root == node) {
    
    
            return true;
        }
        if (contains(root.left, node)) {
    
    
            return true;
        }
        return contains(root.right, node);
    }
}

二分木作成文字列

リンク:二分木作成文字列
ここに画像の説明を挿入

class Solution {
    
    
    public String tree2str(TreeNode t) {
    
    
        StringBuilder sb = new StringBuilder();
        doTree2str(t, sb);
        return sb.toString();
    }
    
    private void doTree2str(TreeNode t, StringBuilder sb) {
    
    
        if (t != null) {
    
    
            sb.append(t.val);
            if (t.left != null || t.right != null) {
    
    
                sb.append('(');
                doTree2str(t.left, sb);
                sb.append(')');
                if (t.right != null) {
    
    
                    sb.append('(');
                    doTree2str(t.right, sb);
                    sb.append(')');
                }
            }
        }
    }
}

おすすめ

転載: blog.csdn.net/weixin_52142731/article/details/115322790