码迷,mamicode.com
首页 > 编程语言 > 详细

java基础编程——树的子结构

时间:2018-09-03 15:33:54      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:item   不包含   img   sub   []   9.png   nod   结束   ring   

题目描述

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

题目代码

/**
 * 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
 * Created by YuKai Fan on 2018/9/3.
 */
public class HasSubTree {
    public static void main(String[] args) {
        TreeNode a = new TreeNode(2);
        a.left = new TreeNode(4);
        a.right = new TreeNode(6);
        a.left.left = new TreeNode(7);
        a.left.right = new TreeNode(9);
        a.right.right = new TreeNode(21);
        a.right.left = new TreeNode(14);

        TreeNode a1 = new TreeNode(2);
        a1.left = new TreeNode(4);
        a1.right = new TreeNode(6);
        boolean b = hasSubTree(a, a1);
        System.out.println(b);
    }

    public static boolean hasSubTree(TreeNode root1, TreeNode root2) {
        boolean result = false;
        //判断前提两个树都是非空的
        if (root1 != null && root2 != null) {
            //如果存在root1的节点与root2的根节点相等
            if (root1.val == root2.val) {
                //以root2的根节点为起点判断是否包含root2
                result = isSubTree(root1, root2);
            }
            //如果找不到,就去root1的左子树循环递归
            if (!result) {
                result = hasSubTree(root1.left, root2);
            }
            //如果左子树也找不到,就去root1的右子树循环递归
            if (!result) {
                result = hasSubTree(root1.right, root2);
            }
        }
        return result;
    }
    public static boolean isSubTree(TreeNode root1, TreeNode root2) {
        //如果root2遍历完了都能在root1中对应上,返回true
        if (root2 == null) {
            return true;
        }
        //如果root1遍历完了,而root2还没结束,则说明root1不包含root2 ,返回false
        if (root1 == null) {
            return false;
        }
        //如果其中有一个点没有对应上,返回false
        if (root1.val != root2.val) {
            return false;
        }
        //如果根节点对应上,那么就分别去子节点中匹配
        return isSubTree(root1.left, root2.left) && isSubTree(root1.right, root2.right);
    }
}
/**
 * Created by YuKai Fan on 2018/9/3.
 */
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int val) {
        this.val = val;
    }

}

题目延伸

二叉树的子树和子结构

  子树的意思是只要包含了一个节点,就必须包含这个节点下的所有节点

  子结构的意思是包含了一个节点,可以取左子树或者右子树,或者都不取

简单的说,就是子结构可以是树的任何一部分

下面举个简单的例子:

如下图1是7节点,高度为3的二叉树

图1:

  技术分享图片

图1的子树可以是:

技术分享图片

图1的子结构为:

由于子结构可以是原树的任意一个部分,因此图4就是一个子结构。

 

 技术分享图片

如何判断二叉树的子树

分析:因为子树表示,如果包含了一个节点,就必须包括节点下的所有节点。(所以上图4,不是树的子树。而是子结构!!!)

所以代码在上面的基础上修改isSubTree()的代码

public static boolean isSubTree2(TreeNode root1, TreeNode root2) {
        /*因为子树表示,如果包含了一个节点,就必须包括节点下的所有节点。
          所以只有当root1与root2同时遍历结束都为空时,才能返回true
        */
        if (root1 == null && root2 == null) {
            return true;
        } else if (root1 != null && root2 != null) {
            if (root1.val != root2.val) {
                return false;
            }
            return isSubTree2(root1.left,root2.left) && isSubTree2(root1.right, root2.right);
        } else {
            return false;
        }
    }

 

 

 

java基础编程——树的子结构

标签:item   不包含   img   sub   []   9.png   nod   结束   ring   

原文地址:https://www.cnblogs.com/FanJava/p/9578702.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!