题目:输入两棵二叉树A和B,判断B是不是A的子结构。二叉树结点的定义如下:
struct BinaryTreeNode{
       int  m_nValue;
       BinaryTreeNode*    m_pLeft;
       BinaryTreeNode*    m_pRight;
}

代码实现:

package com.yyq;

/**
* Created by Administrator on 2015/9/15.
*/
public class SubstructureInTree {
public static boolean hashSubTree(BinaryTreeNode pRoot1, BinaryTreeNode pRoot2) {
boolean result = false;
if (pRoot1 != null && pRoot2 != null) {
if (pRoot1.getM_nValue() == pRoot2.getM_nValue()) {
result = doesTree1HaveTree2(pRoot1, pRoot2);
}
if (!result) {
result = hashSubTree(pRoot1.getM_pLeft(), pRoot2);
}
if (!result) {
result = hashSubTree(pRoot1.getM_pRight(), pRoot2);
}
}
return result;
} public static boolean doesTree1HaveTree2(BinaryTreeNode pRoot1, BinaryTreeNode pRoot2) {
if (pRoot2 == null)
return true;
if (pRoot1 == null)
return false;
if (pRoot1.getM_nValue() != pRoot2.getM_nValue())
return false;
return doesTree1HaveTree2(pRoot1.getM_pLeft(), pRoot2.getM_pLeft()) && doesTree1HaveTree2(pRoot1.getM_pRight(), pRoot2.getM_pRight());
} // ====================测试代码====================
public static void Test(String testName, BinaryTreeNode pRoot1, BinaryTreeNode pRoot2, boolean expected) {
if (hashSubTree(pRoot1, pRoot2) == expected)
System.out.println(testName + " passed.");
else
System.out.println(testName + " fail.");
} // 树中结点含有分叉,树B是树A的子结构
// 8 8
// / \ / \
// 8 7 9 2
// / \
// 9 2
// / \
// 4 7
public static void Test1() {
BinaryTreeNode pNodeA1 = new BinaryTreeNode(8);
BinaryTreeNode pNodeA2 = new BinaryTreeNode(8);
BinaryTreeNode pNodeA3 = new BinaryTreeNode(7);
BinaryTreeNode pNodeA4 = new BinaryTreeNode(9);
BinaryTreeNode pNodeA5 = new BinaryTreeNode(2);
BinaryTreeNode pNodeA6 = new BinaryTreeNode(4);
BinaryTreeNode pNodeA7 = new BinaryTreeNode(7); pNodeA1.connectTreeNodes(pNodeA2, pNodeA3);
pNodeA2.connectTreeNodes(pNodeA4, pNodeA5);
pNodeA5.connectTreeNodes(pNodeA6, pNodeA7); BinaryTreeNode pNodeB1 = new BinaryTreeNode(8);
BinaryTreeNode pNodeB2 = new BinaryTreeNode(9);
BinaryTreeNode pNodeB3 = new BinaryTreeNode(2); pNodeB1.connectTreeNodes(pNodeB2, pNodeB3);
Test("Test1", pNodeA1, pNodeB1, true);
pNodeA1 = null;
pNodeB1 = null;
} // 树中结点含有分叉,树B不是树A的子结构
// 8 8
// / \ / \
// 8 7 9 2
// / \
// 9 3
// / \
// 4 7
public static void Test2() {
BinaryTreeNode pNodeA1 = new BinaryTreeNode(8);
BinaryTreeNode pNodeA2 = new BinaryTreeNode(8);
BinaryTreeNode pNodeA3 = new BinaryTreeNode(7);
BinaryTreeNode pNodeA4 = new BinaryTreeNode(9);
BinaryTreeNode pNodeA5 = new BinaryTreeNode(3);
BinaryTreeNode pNodeA6 = new BinaryTreeNode(4);
BinaryTreeNode pNodeA7 = new BinaryTreeNode(7); pNodeA1.connectTreeNodes(pNodeA2, pNodeA3);
pNodeA2.connectTreeNodes(pNodeA4, pNodeA5);
pNodeA5.connectTreeNodes(pNodeA6, pNodeA7); BinaryTreeNode pNodeB1 = new BinaryTreeNode(8);
BinaryTreeNode pNodeB2 = new BinaryTreeNode(9);
BinaryTreeNode pNodeB3 = new BinaryTreeNode(2); pNodeB1.connectTreeNodes(pNodeB2, pNodeB3); Test("Test2", pNodeA1, pNodeB1, false);
pNodeA1 = null;
pNodeB1 = null;
} // 树中结点只有左子结点,树B是树A的子结构
// 8 8
// / /
// 8 9
// / /
// 9 2
// /
// 2
// /
//
public static void Test3() {
BinaryTreeNode pNodeA1 = new BinaryTreeNode(8);
BinaryTreeNode pNodeA2 = new BinaryTreeNode(8);
BinaryTreeNode pNodeA3 = new BinaryTreeNode(9);
BinaryTreeNode pNodeA4 = new BinaryTreeNode(2);
BinaryTreeNode pNodeA5 = new BinaryTreeNode(5); pNodeA1.connectTreeNodes(pNodeA2, null);
pNodeA2.connectTreeNodes(pNodeA3, null);
pNodeA3.connectTreeNodes(pNodeA4, null);
pNodeA4.connectTreeNodes(pNodeA5, null); BinaryTreeNode pNodeB1 = new BinaryTreeNode(8);
BinaryTreeNode pNodeB2 = new BinaryTreeNode(9);
BinaryTreeNode pNodeB3 = new BinaryTreeNode(2); pNodeB1.connectTreeNodes(pNodeB2, null);
pNodeB2.connectTreeNodes(pNodeB3, null); Test("Test3", pNodeA1, pNodeB1, true);
pNodeA1 = null;
pNodeB1 = null;
} // 树中结点只有左子结点,树B不是树A的子结构
// 8 8
// / /
// 8 9
// / /
// 9 3
// /
// 2
// /
//
public static void Test4() {
BinaryTreeNode pNodeA1 = new BinaryTreeNode(8);
BinaryTreeNode pNodeA2 = new BinaryTreeNode(8);
BinaryTreeNode pNodeA3 = new BinaryTreeNode(9);
BinaryTreeNode pNodeA4 = new BinaryTreeNode(2);
BinaryTreeNode pNodeA5 = new BinaryTreeNode(5); pNodeA1.connectTreeNodes(pNodeA2, null);
pNodeA2.connectTreeNodes(pNodeA3, null);
pNodeA3.connectTreeNodes(pNodeA4, null);
pNodeA4.connectTreeNodes(pNodeA5, null); BinaryTreeNode pNodeB1 = new BinaryTreeNode(8);
BinaryTreeNode pNodeB2 = new BinaryTreeNode(9);
BinaryTreeNode pNodeB3 = new BinaryTreeNode(3); pNodeB1.connectTreeNodes(pNodeB2, null);
pNodeB2.connectTreeNodes(pNodeB3, null); Test("Test4", pNodeA1, pNodeB1, false);
pNodeA1 = null;
pNodeB1 = null;
} // 树中结点只有右子结点,树B是树A的子结构
// 8 8
// \ \
// 8 9
// \ \
// 9 2
// \
// 2
// \
// 5
public static void Test5() {
BinaryTreeNode pNodeA1 = new BinaryTreeNode(8);
BinaryTreeNode pNodeA2 = new BinaryTreeNode(8);
BinaryTreeNode pNodeA3 = new BinaryTreeNode(9);
BinaryTreeNode pNodeA4 = new BinaryTreeNode(2);
BinaryTreeNode pNodeA5 = new BinaryTreeNode(5); pNodeA1.connectTreeNodes(null, pNodeA2);
pNodeA2.connectTreeNodes(null, pNodeA3);
pNodeA3.connectTreeNodes(null, pNodeA4);
pNodeA4.connectTreeNodes(null, pNodeA5); BinaryTreeNode pNodeB1 = new BinaryTreeNode(8);
BinaryTreeNode pNodeB2 = new BinaryTreeNode(9);
BinaryTreeNode pNodeB3 = new BinaryTreeNode(2); pNodeB1.connectTreeNodes(null, pNodeB2);
pNodeB2.connectTreeNodes(null, pNodeB3); Test("Test5", pNodeA1, pNodeB1, true);
pNodeA1 = null;
pNodeB1 = null;
} // 树A中结点只有右子结点,树B不是树A的子结构
// 8 8
// \ \
// 8 9
// \ / \
// 9 3 2
// \
// 2
// \
// 5
public static void Test6() {
BinaryTreeNode pNodeA1 = new BinaryTreeNode(8);
BinaryTreeNode pNodeA2 = new BinaryTreeNode(8);
BinaryTreeNode pNodeA3 = new BinaryTreeNode(9);
BinaryTreeNode pNodeA4 = new BinaryTreeNode(2);
BinaryTreeNode pNodeA5 = new BinaryTreeNode(5); pNodeA1.connectTreeNodes(null, pNodeA2);
pNodeA2.connectTreeNodes(null, pNodeA3);
pNodeA3.connectTreeNodes(null, pNodeA4);
pNodeA4.connectTreeNodes(null, pNodeA5); BinaryTreeNode pNodeB1 = new BinaryTreeNode(8);
BinaryTreeNode pNodeB2 = new BinaryTreeNode(9);
BinaryTreeNode pNodeB3 = new BinaryTreeNode(3);
BinaryTreeNode pNodeB4 = new BinaryTreeNode(2); pNodeB1.connectTreeNodes(null, pNodeB2);
pNodeB2.connectTreeNodes(pNodeB3, pNodeB4); Test("Test6", pNodeA1, pNodeB1, false);
pNodeA1 = null;
pNodeB1 = null;
} // 树A为空树
public static void Test7() {
BinaryTreeNode pNodeB1 = new BinaryTreeNode(8);
BinaryTreeNode pNodeB2 = new BinaryTreeNode(9);
BinaryTreeNode pNodeB3 = new BinaryTreeNode(3);
BinaryTreeNode pNodeB4 = new BinaryTreeNode(2); pNodeB1.connectTreeNodes(null, pNodeB2);
pNodeB2.connectTreeNodes(pNodeB3, pNodeB4); Test("Test7", null, pNodeB1, false);
pNodeB1 = null;
} // 树B为空树
public static void Test8() {
BinaryTreeNode pNodeA1 = new BinaryTreeNode(8);
BinaryTreeNode pNodeA2 = new BinaryTreeNode(9);
BinaryTreeNode pNodeA3 = new BinaryTreeNode(3);
BinaryTreeNode pNodeA4 = new BinaryTreeNode(2); pNodeA1.connectTreeNodes(null, pNodeA2);
pNodeA2.connectTreeNodes(pNodeA3, pNodeA4); Test("Test8", pNodeA1, null, false);
pNodeA1 = null;
} // 树A和树B都为空
public static void Test9() {
Test("Test9", null, null, false);
} public static void main(String[] args) {
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
Test8();
Test9();
}
}
 
输出结果:
Test1 passed.
Test2 passed.
Test3 passed.
Test4 passed.
Test5 passed.
Test6 passed.
Test7 passed.
Test8 passed.
Test9 passed.

P117、面试题18:树的子结构的更多相关文章

  1. 剑指offer-面试题18.树的子结构

    题目:输入两棵二叉树A和B,判断B是不是A的子结构. 二叉树节点定义如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; ...

  2. 《剑指offer》面试题18 树的子结构 Java版

    (输入两棵二叉树A和B,判断B是不是A的子结构.补充下,根据书中的代码来看,子结构的定义并不包括叶子节点下的null,也就是说只要B的存在数字的结构存在于A中就行,那么如果B是null树,那么就不属于 ...

  3. 剑指Offer:面试题18——树的子结构(java实现)

    问题描述: 输入两棵二叉树A和B,判断B是不是A的子结构.二叉树结点的定义如下: public class TreeNode { int val = 0; TreeNode left = null; ...

  4. 【剑指Offer】面试题26. 树的子结构

    题目 输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 例如: 给定的树 A:      3     / \ ...

  5. 《剑指offer》面试题26. 树的子结构

    问题描述 输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 例如: 给定的树 A:      3     / ...

  6. 剑指Offer面试题:17.树的子结构

    一.题目:树的子结构 题目:输入两棵二叉树A和B,判断B是不是A的子结构.例如下图中的两棵二叉树,由于A中有一部分子树的结构和B是一样的,因此B是A的子结构. 该二叉树的节点定义如下,这里使用C#语言 ...

  7. 剑指offer 18:树的子结构

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 验证B是不是A的子树,直觉做法,按照任意次序遍历A树,一旦出现和B树根节点相同的子节点, ...

  8. 《剑指offer》第二十六题(树的子结构)

    // 面试题26:树的子结构 // 题目:输入两棵二叉树A和B,判断B是不是A的子结构. #include <iostream> struct BinaryTreeNode { doubl ...

  9. 17.树的子结构(python)

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) class Solution: def HasSubtree(self, pRoot1, pRoo ...

  10. 剑指offer——树的子结构 (JAVA代码)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构). 解题思路: 首先看牛客网给出的测试用例: ...

随机推荐

  1. iOS 非ARC基本内存管理系列 2-多对象内存管理(1)

    单个对象的内存管理非常简单无非就是alloc对应release,retain对应release.但是如果涉及到很多对象,而且对象与对象有联系的时候该怎么去管理对象的内存呢. 比如同样一本书有好3个人购 ...

  2. springMVC整合memcached

    非原创,文章转自:http://www.cnblogs.com/xiaoqingxin/p/4132391.html 文章我就不全copy了,摘抄下我关注的部分,想看原文的请移步上面文章链接 appl ...

  3. eclipse安装ermaster建模插件

    下载ermaster.jar 放到plugins重启eclipse即可

  4. linux乱码问题:LANG变量的秘诀

    对于国内的Linux用户,经常烦恼的一个问题是:系统常常在需要显示中文的时候却显示成了乱码,而由于某些原因,需要英文界面的系统的时候,却苦于系统不能正常输入和显示中文.另外,由于大部分主要Linux发 ...

  5. having count(*) > 1

    select phone from aa group by phone having count(*) > 1 后面的having子句是什么意思啊? 以phone分组,分组后每组里面phone出 ...

  6. 【学习总结】【多线程】 线程 & 进程 & NSThread(多线程的一套API)

    一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开 Chrome.Xcode,系统就会分别启动2个进 ...

  7. 各个浏览器下实现Ajax的JS

    var xmlhttpget; try {     // Firefox, Opera 8.0+, Safari     xmlhttpget = new window.XMLHttpRequest( ...

  8. python学习笔记23(时间与日期 (time, datetime包))

    Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime. time包 time包基于C语言的库函数(library functions).Python的解释器通 ...

  9. java程序练习:数组中随机10个数中的最大值

    //定义输入:其实是一个可以保存10个整数的数组 //使用循环遍历,生成10个随机数,放入每个元素中//打桩,数组中的内容 //定义输出变量 //将数组中第一个元素取出,保存在max中,当靶子 //遍 ...

  10. @Entity设置OneToMany

    Hibernate设置bean映射数据库的方式有配置模式与注解模式,下面通过注解模式配置OneToMany @Entity @Table(name="csdnbbs_sys_catalog& ...