【剑指Offer】26.树的子结构

题目

输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)

假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构

【剑指Offer】26.树的子结构_第1张图片

数据范围:

0 <= A的节点个数 <= 10000

0 <= B的节点个数 <= 10000

示例1

输入:{8,8,7,9,2,#,#,#,#,4,7},{8,9,2}

返回值:true

示例2

输入:{1,2,3,4,5},{2,4}

返回值:true

示例3

输入:{1,2,3},{3,1}

返回值:false

解答

源代码

import java.util.*;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if (root1 == null || root2 == null) {
            return false;
        }

        Deque row = new ArrayDeque<>();
        row.add(root1);

        while (!row.isEmpty()) {
            TreeNode node = row.pollFirst();

            if (node.left != null) {
                row.add(node.left);
            }

            if (node.right != null) {
                row.add(node.right);
            }

            if (isSubtree(node, root2)) {
                return true;
            }
        }

        return false;
    }

    public boolean isSubtree(TreeNode root1, TreeNode root2) {
        if (root2 == null) {
            return true;
        } else {
            if (root1 == null) {
                return false;
            } else {
                if (root1.val != root2.val) {
                    return false;
                } else {
                    return isSubtree(root1.left, root2.left) && isSubtree(root1.right, root2.right);
                }
            }
        }
    }
}

总结

主函数遍历二叉树A的每个结点,以当前结点作为根节点和二叉树B进行比较。

使用递归算法,判断每个结点的值是否相等,不相等则返回false,相等则继续向子节点进行递归。

你可能感兴趣的:(剑指Offer,算法,java,二叉树)