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实现