P117、面试题18:树的子结构
题目:输入两棵二叉树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();
}
}
P117、面试题18:树的子结构的更多相关文章
- 剑指offer-面试题18.树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构. 二叉树节点定义如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; ...
- 《剑指offer》面试题18 树的子结构 Java版
(输入两棵二叉树A和B,判断B是不是A的子结构.补充下,根据书中的代码来看,子结构的定义并不包括叶子节点下的null,也就是说只要B的存在数字的结构存在于A中就行,那么如果B是null树,那么就不属于 ...
- 剑指Offer:面试题18——树的子结构(java实现)
问题描述: 输入两棵二叉树A和B,判断B是不是A的子结构.二叉树结点的定义如下: public class TreeNode { int val = 0; TreeNode left = null; ...
- 【剑指Offer】面试题26. 树的子结构
题目 输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 例如: 给定的树 A: 3 / \ ...
- 《剑指offer》面试题26. 树的子结构
问题描述 输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 例如: 给定的树 A: 3 / ...
- 剑指Offer面试题:17.树的子结构
一.题目:树的子结构 题目:输入两棵二叉树A和B,判断B是不是A的子结构.例如下图中的两棵二叉树,由于A中有一部分子树的结构和B是一样的,因此B是A的子结构. 该二叉树的节点定义如下,这里使用C#语言 ...
- 剑指offer 18:树的子结构
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 验证B是不是A的子树,直觉做法,按照任意次序遍历A树,一旦出现和B树根节点相同的子节点, ...
- 《剑指offer》第二十六题(树的子结构)
// 面试题26:树的子结构 // 题目:输入两棵二叉树A和B,判断B是不是A的子结构. #include <iostream> struct BinaryTreeNode { doubl ...
- 17.树的子结构(python)
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) class Solution: def HasSubtree(self, pRoot1, pRoo ...
- 剑指offer——树的子结构 (JAVA代码)
版权声明:本文为博主原创文章,未经博主允许不得转载. 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构). 解题思路: 首先看牛客网给出的测试用例: ...
随机推荐
- 利用mysqld_multi启动管理多实例
利用mysqld_multi启动管理多实例 官方管理多实例的一个脚本peer #将之前的目录清空 [root@mysql01 mysql]# tree /data/mysql/ /data/mysql ...
- google map 点与点画线
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Review PHP设计模式之——注册模式
注册模式: class DbConnections{ var $_store = array(); public function isValid($key) { return isset($this ...
- DISCUZ! X2.5设置仅允许QQ登录注册论坛 加固会员注册机制
论坛稍微有点起色之后,很多站长就会担心论坛经常被人恶意灌水.注册机.顶贴机等等一些列非法的手段.通常站长都会通过一些后台的设置和插件等等一 切有效的方法预防,但更多的站长会通过限制用户注册会员,需注册 ...
- Android UI学习1:控件和基本事件的响应
在任何一个 GUI 系统中,控制界面上的控件(通常称为控件)都是一个基本的内容.对于 Android 应用程序,控件称为 View. 在 Android 中,在处理 UI 中的各种元素的时候,两个程序 ...
- WPF如何卸载U盘(弹出USB设备)
应用程序和硬件设备的通信过程是:应用程序使用CreateFile函数打开设备,然后用DeviceIoControl()与硬件设备通信. CreateFile函数: [DllImport("k ...
- WPF中利用后台代码实现窗口分栏动态改变
在WPF中实现窗口分栏并能够通过鼠标改变大小已经非常容易,例如将一个GRID分成竖排三栏显示,就可以将GRID先分成5列,其中两个固定列放GridSplitter. <Grid Backgrou ...
- Android UI效果实现——滑动模糊渐变效果实现
前言: 大家应该都看到过iOS7解锁屏幕的滑动模糊渐变效果,好了,现在可以把手纸收起来了,今天黄老师就给大家讲一下如何在Android平台上 实现类似的滑动模糊渐变效果,其实方式远比你想像的简单. 目 ...
- ^M的前世今生
^M 是ascii中的'\r', 回车符,是16进制的0x0D,8进制的015,十进制的13. 回想计算机发展,旧的打字机使用两个字符来开始一个新行.首先是一个字符命令使打印头移回开始位置(回车),然 ...
- EXTJS 4.2 资料 控件之checkboxgroup的用法(静态数据)
1.页面 1.1点击‘横幅’,需要动态显示隐藏文本框 { xtype: 'fieldset', title: '指定附加图&横幅设置', collapsible: true, items: [ ...