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

Posted MichaelKai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础编程——树的子结构相关的知识,希望对你有一定的参考价值。

题目描述

输入两棵二叉树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基础编程——树的子结构的主要内容,如果未能解决你的问题,请参考以下文章

挑战程序设计竞赛(算法和数据结构)——8.4二叉树的遍历的JAVA实现

Java编程基础-选择和循环语句

Python数据结构系列☀️《树与二叉树-基础知识》——知识点讲解+代码实现☀️

与二叉树有关的编程题的Java代码实现

数据结构基础复习二叉树的递归遍历

简单的JAVA多叉树问题实现