树的子结构,Java实现,剑指Offer面试题26

主要是考察树的遍历和指针的运用,难度不大



/**
 * 树的子结构
 */
public class Main26 {
    /**
     * 入口函数
     * 优先检测空指针等特殊情况
     * @param root1
     * @param root2
     * @return
     */
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if (root2 == null){
            return true;
        }
        if (root1 == null && root2 != null){
            return false;
        }
        //从1树根节点开始,对1树的节点进行先序遍历,遍历的过程即判断1树节点值是否跟2树的节点值相同
        //若相同,是否为子结构
        return preOrder(root1, root2);


    }

    /**
     * 先序遍历,只要有满足存在一种存子结构,立即返回真
     * @param root1
     * @param root2
     * @return
     */
    public boolean preOrder(TreeNode root1,TreeNode root2){
        if (root1 != null){
            if (preCheck(root1, root2)){
                return true;
            }
            if (preOrder(root1.left,root2)){
                return true;
            }
            if (preOrder(root1.right,root2)){
                return true;
            }

        }
        return false;

    }

    /**
     * 对1树的当前节点检查是否含2树的子结构
     * @param root1
     * @param root2
     * @return
     */
    public boolean preCheck(TreeNode root1,TreeNode root2){
       //2树的节点为空返回真 
       if (root2 == null){
           return true;
           //1树和2树的当前节点都不为空,则判断它们的子树是否对应相等,
           // 这里递归判断,只要有一个子树不等,则马上返回false
       }else if (root2 != null && root1 != null && root1.val == root2.val){
           return preCheck(root1.left,root2.left) && preCheck(root1.right, root2.right);
       }
       //若为其他情况都是不相等或者2树不为空,1树为空;
       //因此都不满足树子结构,返回假 
       return false;
    }

    public static void main(String[] args) {
        TreeNode treeNode = new TreeNode(8);
        treeNode.left = new TreeNode(8);
        treeNode.right = new TreeNode(7);
        treeNode.left.left = new TreeNode(9);
        treeNode.left.right = new TreeNode(2);
        treeNode.left.right.left = new TreeNode(4);
        treeNode.left.right.right = new TreeNode(7);
        TreeNode treeNode2 = new TreeNode(8);
        treeNode2.left = new TreeNode(9);
        treeNode2.right = new TreeNode(2);
        Main26 main26 = new Main26();
        main26.HasSubtree(treeNode,treeNode2);
    }
}

猜你喜欢

转载自blog.csdn.net/aa792978017/article/details/89197514