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:我们约定空树不是任意一个树的子结构). 解题思路: 首先看牛客网给出的测试用例: ...
随机推荐
- Poj 2996 Help Me with the Game
1.Link: http://poj.org/problem?id=2996 2.Content: Help Me with the Game Time Limit: 1000MS Memory ...
- HTML5之 Microdata微数据
- 为何需要微数据 长篇加累版牍,不好理解 微标记来标注其中内容,让其容易识辨 - RDFa Resource Description Framework http://www.w3.org/TR/m ...
- ios水果风暴游戏源码下载
游戏源码是从那个IOS教程网IOS.662p.com分享给大家的. 这是一款ios水果风暴游戏源码下载,介绍给大家一下,喜欢的朋友可以下载学习一下吧.应用介绍:这是一个以获得高分和挑战更高难度为目的的 ...
- 完美高仿精仿京东商城手机客户端android版源码
完美高仿精仿京东商城手机客户端android版源码,是从安卓教程网那边转载过来的,这款应用源码非常不错的,也是一个非常优秀的应用源码的,希望能够帮到学习的朋友. _js_op> <igno ...
- Nodejs微信接口
代码重要部分都已详细注释,test.js为实例,如果启动url请求,那么程序默认对json格式数据友好,如果有特殊需要,请自行修改返回数据的处理格式 大概功能简介为下: this._token 提供t ...
- 编译php5.6
没想到编译个LAMP这么麻烦又简单. 按照官网的做就可以了,只是我在CentOs下一直会提示出现这个错误 按照官网的安装方法:install 用下面的参数: ./configure --with-ap ...
- H5全景视频VR视频
公司的有个专题页面涉及到全景视频展示这个技术点,找到一个相关的库. http://www.utovr.com/sdk/download 这里有个免费的SDK可以下载. 里面也有案例可以看,代码就照着 ...
- 3.12php
这是我的第一个博客 纪念一下 反正都是自己看 第一个问题 出现错误 当图片超过1M时就可能出现以下错误 当然这个也跟你php.ini设置有关 如果你php设置里 memory_limit 16M ...
- mvc 之 @Html.DropDownList
Dictionary<string, string> myDic = new Dictionary<string, string>(); myDic.Add(System.DB ...
- C++ 编写 CorelDRAW CPG 插件例子(2)—ClearFill
这是另一个例子: 贴上主要代码: #include "stdafx.h" #include <tchar.h> #import "libid:95E23C91 ...