判断A树是否包含B树结构

题目:输入两棵二叉树A和B,判断B是不是A的子结构

分析:根据数的遍历方法,首先想到的是采用递归的方式要更简单些,树A从根节点进行遍历,首先判断与B的根节点值是否相等,如果相等则进行递归遍历验证,否则验证树A的其他节点,直到所有的结点遍历完。

注意的就是指针是否为NULL,因为自己编程能力不好,所以有些很简单的也做了注释,方便以后自己理解。


//判断B是不是A的子树
struct BinaryTree{
int m_value;
BinaryTree * LeftTree;
BinaryTree * RightTree;
};
bool DoesHasSubTree(BinaryTree *pRoot1,BinaryTree *pRoot2);
bool HasSubTree(BinaryTree * pRoot1,BinaryTree * pRoot2)
{

//当结点不相同的时候怎么去遍历其他的结点呢?
//这里采用的方法是设置一个result,当result=false时候我们并不是直接结束程序,而是继续去遍历其他点,直到所有的点都遍历完
//这里hasSubTree函数主要是为了遍历结点,而真正进行匹配是由函数DoesHasSubTree来实现
bool result=false;

if(pRoot1!=NULL&&pRoot2!=NULL) //除此之外的所有情况我们都认为是不包含子树的,条件是不能丢的
{
if(pRoot1->m_value==pRoot2->m_value) //一旦查到有结点相同,就进行递归遍历进行匹配见下面函数
result=DoesHasSubTree(pRoot1,pRoot2) //这个函数式递归函数,所以在里面还需要进行判断pRoot1->m_value==pRoot2->m_value是否相等
if(!result) //遍历了根节点接下来从左子树开始遍历,(递归的作用是左子树变成根节点进行匹配。)有点类似深度优先搜索。
result=HasSubTree(pRoot1->LeftTree,pRoot2->LeftTree);
if(!result) //当所有左子树没有匹配到我们就开始匹配右子树,直到所有的结点遍历完。
result=HasSubTree(pRoot1->RightTree,pRoot2->RightTree);
}
return result;//返回最终的结果
}
bool DoesHasSubTree(BinaryTree *pRoot1,BinaryTree *pRoot2)
{
if(pRoot2==NULL) //当子树遍历完的标志,可以遍历完说明过程中没有碰到false条件,也就是都是匹配的
return true;
if(pRoot1==NULL)
return false;

if(pRoot1->m_value!=pRoot2->m_value)
return false;
return DoesHasSubTree(pRoot1->LeftTree,pRoot2->LeftTree)&& DoesHasSubTree(pRoot1->RightTree,pRoot2->RightTree); //用&&对左右两边都进行判断
}

判断A树是否包含B树结构

时间: 2024-08-16 09:36:24

判断A树是否包含B树结构的相关文章

15-- 输入两个二叉树A和B,判断B树是否包含于A树。

// // main.cpp // subStructureInTree // // Created by Hugo Cao on 15/7/10. // Copyright (c) 2015年 Hugo Cao . All rights reserved. // /* 问题描述: 输入两个二叉树A和B,判断B树是否包含于A树. 查找B子树是否在A中, 思路:(1)首先寻找B根结点,是否在A中, (2)如果在,就查看是否A树包含B树 思考如何遍历A树寻找更结点,因为只有前序遍历可以最先找到根节点

在Java中如何高效判断数组中是否包含某个元素

如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Overflow中也是一个非常热门的问题.在投票比较高的几个答案中给出了几种不同的方法,但是他们的时间复杂度也是各不相同的.本文将分析几种常见用法及其时间成本. 检查数组是否包含某个值的方法 使用List public static boolean useList(String[] arr, String targetValue) { return Arrays.asLis

PHP判断字符串中是否包含指定字符串,支持中文哦

RT,随手写的 1 /** 2 * 判断字符串中是否包含指定字符串 3 * @var source 源字符串 4 * @var target 要判断的是否包含的字符串 5 * @return bool 6 */ 7 function hasstring($source,$target){ 8 preg_match_all("/$target/sim", $source, $strResult, PREG_PATTERN_ORDER); 9 return !empty($strResul

LeetCode Same Tree (判断相同树)

题意:如题 思路:递归解决,同判断对称树的原理差不多.先保证当前两个结点是相等的,再递归保证两左结点是相等的,再递归保证右结点是相等的. 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 *

编程判断一个树是完全二叉树(使用层次遍历实现)

完全二叉树:一棵具有N个节点的二叉树的结构与满二叉树的前N个节点的结构相同 如何判断一个树是完全二叉树 可以使用层序遍历,只需2个步骤 第一步:如果遍历到一个节点只有右子树没有左子树,则不是完全二叉树 第二部:如果遍历到一个节点只有左子树,那么后面遍历到的节点必须是叶子节点,否则也不是完全二叉树 排除以上两种情况,则树是完全二叉树 核心代码: //层序遍历 int LayerOrder(BiTreeNode *head) { bool flag=0; LQueue Q; Initiate_Que

String的两个API,判断指定字符串是否包含另一字符串,在字符串中删除指定字符串。

// 在字符串中删除指定字符串. String phoneNum="1795112345"; phoneNum = phoneNum.replace("17951", ""); System.out.println(phoneNum); //判断指定字符串是否包含另一字符串 String phoneNum="1795112345"; String IpNum="17951"; return phoneNum

判断DataReader中是否包含某个字段

利用DataReader的GetName()方法,可以获取字段名称 for (int i=0; i<dataReader.FieldCount; i++) { //判断是否含有fieldName字段 if(dataReader[i].GetName().Equals(fieldName); } 判断DataReader中是否包含某个字段,布布扣,bubuko.com

数据库中判断内容中是否包含中文

SQL Server 用patindex()函数判断,例如'patindex(%[吖-做]%',字段名)>0 Oracle 用lengthb()和length()函数求字段对应内容的的长度,长度不一样则说明内容中包含汉字 数据库中判断内容中是否包含中文,布布扣,bubuko.com

java判断字符串中是否包含汉字

原文:java判断字符串中是否包含汉字 源代码下载地址:http://www.zuidaima.com/share/1550463517428736.htm package com.zuidaima.util; /** *@author www.zuidaima.com **/ public class test { public static void main(String[] args) { String a = "中国China"; for (int i=a.length();