// test20.cpp : 定义控制台应用程序的入口点。

//

``````#include "stdafx.h"
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<stack>

using namespace std;

struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
//1.先在二叉树tree1中找到tree2的根节点
//2.在判断tree2的左右孩子是否在tree1中
//3.如果不存在继续遍历tree1的左孩子和右孩子
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if (pRoot1 == NULL) return false;//这一点很重要，要不然if (pRoot1->val == pRoot2->val)会报空指针的错误
if (pRoot2 == NULL) return false;

bool result = false;
if (pRoot1->val == pRoot2->val)
{
result = DoseTree1HasTree2(pRoot1,pRoot2);
}
if (result == false)
result = HasSubtree(pRoot1->left,pRoot2);
if (result == false)
result = HasSubtree(pRoot1->right,pRoot2);
return result;

}

//如果tree1为空，返回false;如果tree2为空，返回true；如果两者都不为空，继续判断其左右孩子
bool DoseTree1HasTree2(TreeNode* tree1, TreeNode* tree2)
{
if (tree1 == NULL &&tree2 == NULL) return true;//tree1和tree2都为空
else if (tree1 == NULL && tree2!=NULL) return false;
else if (tree1 != NULL && tree2==NULL) return true;
else
{
if (tree1->val != tree2->val) return false;
return DoseTree1HasTree2(tree1->left, tree2->left) && DoseTree1HasTree2(tree1->right, tree2->right);
}

}

void preCreate(TreeNode* &T)
{
int num;
cin >> num;
if (num == 0) T = NULL;
else
{
T = new TreeNode(num);
preCreate(T->left);
preCreate(T->right);
}
}

void preOrder(TreeNode* T)
{
if (T == NULL) return;
else
{
cout << T->val << "  ";
preOrder(T->left);
preOrder(T->right);
}
}
};
int main()
{

Solution so;
TreeNode *T1;
TreeNode *T2;
vector<int> pre = { 1,2,4,7,3,5,6,8 };
vector<int> in = { 4,7,2,1,5,3,8,6 };

cout << "创建T1:" << endl;
so.preCreate(T1);
cout << "创建T1成功！" << endl;

cout << "创建T2:" << endl;
so.preCreate(T2);
cout << "创建T2成功！" << endl;

cout << "T1的前序遍历:" << endl;
so.preOrder(T1);
cout << endl;

//cout << "T2的前序遍历:" << endl;
//so.preOrder(T2);
//cout << endl;

cout << "T2是不是T1的子树：" << endl;
bool result = so.HasSubtree(T1,T2);

cout << result << endl;

cout << endl;
return 0;
}``````

输入两棵二叉树A，B，判断B是不是A的子结构。（ps：我们约定空树不是任意一个树的子结构）的更多相关文章

1. 剑指offer17：输入两棵二叉树A，B，判断B是不是A的子结构。（ps：我们约定空树不是任意一个树的子结构）

1 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 2 思路和方法 (1)先在A中找和B的根节点相同的结点 (2)找到之后遍历对应位置的其他结点, ...

2. 输入两棵二叉树A，B，判断B是不是A的子结构(c++实现)

#include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...

3. 剑指offer38：输入一棵二叉树，求该树的深度

1 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 2 思路和方法 深度优先搜索,每次得到左右子树当前最大路径,选择 ...

4. LeetCode 100. Same Tree 判断两棵二叉树是否相等 C++

Given two binary trees, write a function to check if they are the same or not. Two binary trees are ...

5. same tree(判断两颗二叉树是否相等)

Input: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3] Output: true Example 2: Input: 1 1 / \ 2 2 [1,2], [1,nul ...

6. 【遍历二叉树】08判断两个二叉树是否相同【Same Tree】

迭代版本用的是二叉树的DFS,中的root->right->left +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

7. 笔试算法题（27）：判断单向链表是否有环并找出环入口节点 &amp; 判断两棵二元树是否相等

出题:判断一个单向链表是否有环,如果有环则找到环入口节点: 分析: 第一个问题:使用快慢指针(fast指针一次走两步,slow指针一次走一步,并判断是否到达NULL,如果fast==slow成立,则说 ...

8. LeetCode&mdash;&mdash;Same Tree（判断两棵树是否相同）

问题: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...

9. [程序员代码面试指南]二叉树问题-判断t1树是否包含t2树的全部拓扑结构、[LeetCode]572. 另一个树的子树

题目1 解 先序遍历树1,判断树1以每个节点为根的子树是否包含树2的拓扑结构. 时间复杂度:O(M*N) 注意区分判断总体包含关系.和判断子树是否包含树2的函数. 代码 public class Ma ...

随机推荐

1. svn不能添加.a文件的解决方法

上次说用svn add命令添加.a文件,下面是另外的一种解决办法: 修改~/.subversion/config文件,增加一条 # global-ignores = *.o *.lo *.la *.a ...

2. Spark MLlib - Decision Tree源码分析

http://spark.apache.org/docs/latest/mllib-decision-tree.html 以决策树作为开始,因为简单,而且也比较容易用到,当前的boosting或ran ...

3. C语言中的内存分配与释放

C语言中的内存分配与释放 对C语言一直都是抱着学习的态度,很多都不懂,今天突然被问道C语言的内存分配问题,说了一些自己知道的,但感觉回答的并不完善,所以才有这篇笔记,总结一下C语言中内存分配的主要内容 ...

4. WCF入门教程一[什么是WCF]

一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

5. 洛谷P2320 鬼谷子的钱袋

P2320 06湖南 鬼谷子的钱袋 171通过 480提交 题目提供者xmyzwls 标签各省省选 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 题目有误 数据需要特判 评测系统太神了 题目 ...

6. 引水入城[NOI2010 ]

题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. 为了 ...

7. throws Exception方法异常处理机制

public class T4 { private String sex; public String getSex() { return sex; } public void setSex(Stri ...

8. python之dictionary

1.python3字典 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 d ...

9. C++函数式编程实现牛顿法

In numerical analysis, Newton's method (also known as the Newton–Raphson method), named after Isaac ...

10. 微信H5支付证书过滤

在对接微信支付,退款的时候,遇到 Caused by: java.lang.RuntimeException: java.io.IOException: DerInputStream.getLengt ...