问题描述:给定两个二叉树的根节点,判断第二树是否是第一个树的子树,如果是返回1,否则返回0.

分析:这个是百度的一道笔试题目,属于经典的数据结构问题,子树判断问题,针对这个问题可以采用递归的方法判断,

拿第二个树的每个节点去和第一个树做匹配,如果某个节点匹配成功,就接着往下匹配,否则重新从第二个树的的根节点开始。

注意区别:

一棵树是否为另一棵树的子结构

http://blog.csdn.net/yangquanhui1991/article/details/51786155

测试用例:

树1

4

2            6

1         3   5        7

树2

4

2                 6

树3

6

5                  7

结果:

树2不是树1的子树

树3是树1的子树

代码:

#include <iostream>
#include <stack>
using namespace std;
struct TreeNode
{int val;TreeNode *left;TreeNode *right;TreeNode(int v) : val(v), left(NULL), right(NULL) {}
};
bool IsEqual(TreeNode *root1, TreeNode *root2)
{if (root1 == NULL&&root2 == NULL)return true;if (root2 == NULL || root1 == NULL)return false;if (root1->val != root2->val)return false;return IsEqual(root1->left, root2->left) &&IsEqual(root1->right, root2->right);
}
bool subTree(TreeNode *root1, TreeNode *root2)
{if (root1 == NULL) return false;if (root1->val == root2->val){if (IsEqual(root1, root2))return true;}return subTree(root1->left, root2) || subTree(root1->right, root2);
}bool IsPartTree(TreeNode *root1, TreeNode *root2)
{if (root2 == NULL) return true;else return subTree(root1,root2);
}
TreeNode* createTree1()
{TreeNode *root = new TreeNode(1);TreeNode *p1 = new TreeNode(2);TreeNode *p2 = new TreeNode(3);TreeNode *p3 = new TreeNode(4);TreeNode *p4 = new TreeNode(5);root->left = p1;root->right = p2;p2->left = p3;p2->right = p4;return root;
}
TreeNode* createTree2()
{TreeNode *root = new TreeNode(1);TreeNode *p1 = new TreeNode(2);TreeNode *p2 = new TreeNode(3);root->left = p1;root->right = p2;return root;
}TreeNode* createTree3()
{TreeNode *root = new TreeNode(3);TreeNode *p1 = new TreeNode(4);TreeNode *p2 = new TreeNode(5);root->left = p1;root->right = p2;return root;
}void deleteTree(TreeNode *root)
{if (root != NULL){delete(root->left);delete(root->right);delete root;root = NULL;}
}
int main()
{TreeNode *root = NULL;TreeNode *root1 = createTree1();TreeNode *root2 = createTree2();TreeNode *root3 = createTree3();TreeNode *root4 = NULL;cout << IsPartTree(root1, root2) << endl;cout << IsPartTree(root1, root3) << endl;cout << IsPartTree(root1, root) << endl;cout << IsPartTree(root, root4) << endl;deleteTree(root1);deleteTree(root2);deleteTree(root3);system("pause");return 0;
}

一棵树是否为另一棵树的子树相关推荐

  1. 一棵树是否为另一棵树的子结构

    题目描述 输入两颗二叉树A,B,判断B是不是A的子结构. 问题描述:给定两个二叉树的根节点,判断第二树是否是第一个树的子树,如果是返回1,否则返回0. 分析:这个是百度的一道笔试题目,属于经典的数据结 ...

  2. 海量数据:判断一棵树是否为另一棵树的子树

    T1是一棵含有几百万个节点的树,T2含有几百个节点.判断T2是否是T1 的子树. 首先考虑小数据量的情况,可以根据树的前序和中序遍历所得的字符串,来通过判断T2生成的字符串是否是T1字符串的子串,来判 ...

  3. 二叉树 判断一棵树是否是另一棵树的子树

    题目:判断判断一棵树是否是另一棵树的子树,子树的意思是只要包含了一个结点,就得包含这个结点下的所有节点.意思就是二叉树结点的值也要相等 如下图2就是1的子树 如果将第二颗树根节点右孩子data改为2 ...

  4. 判断一棵树是否为另一棵树的子树

    题目如下: 判断一棵树是否为另一棵树的子树 思路: (1)先构建两棵树,a树和b树,判断b树是否为a树的子树 (2)构建两个方法,一个用来判断传入的两棵树是否相同,为isSameTree:另一个用来判 ...

  5. LeetCode高频题:戈壁滩种树,一排n棵树,至少有k棵树存活时,最终形成的风景线有多少不同的情况

    LeetCode高频题:戈壁滩种树,一排n棵树,至少有k棵树存活时,最终形成的风景线有多少不同的情况 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是 ...

  6. Python 再说勾股树,这次整一棵五彩的任意“生长”的分形树!

    上一篇<Turtle库画一棵对称勾股树,美丽惊艳的分形世界!>中描绘了一棵对称的双色勾股树,详情见:Python Turtle库画一棵对称勾股树,美丽惊艳的分形世界!_汉阳Hann's H ...

  7. 树的应用:求树的叶子节点数 求树的高度、copy一棵树

    #if 0 //树的应用 //1.求树的叶子节点: 度为0的节点 //先判断根节点是否是叶子节点,然后计算左子树的叶子节点个数 //在计算 右子树节点个数void coutLeaf(BiNode *T ...

  8. 判断一棵树是否是另一棵树的子树 java实现

    这是一个很经典的算法题,听起来好像挺难的,但是其实很简单.我觉得我们接触到的问题,并没有难题,只有复杂不复杂.一个再难的问题,也可以分解成一个个简单的问题,再将这些简单的问题交给不同的人去做就构成了一 ...

  9. 判断两个树是否相同判断一棵树是否是一棵树的子树

    判断两棵树是否相同 方法:对两棵树同时做相同的递归判断其值或者是结构是否相同. 以下代码用的是前序遍历.递归方法(毕竟递归好理解而且代码少得可怜). 比较啰嗦的是指针为空的情况,只要把这些情况单独列出 ...

最新文章

  1. configure: error: newly created file is older than distributed files!
  2. 2013 Multi-University Training Contest 9 1011 Arc of Dream
  3. Bellman-Ford 算法 和 动态规划
  4. windows7不支持AllocateAndGetTcpExTableFromStack
  5. 用户登陆python脚本
  6. 20220208--CTF刷题记录--6道简单的MISC题目
  7. Python版——博客网站四 编写日志创建页
  8. 复习Object类_日期时间类_System类_StringBuilder_包装类以及各类的细节
  9. 白鹭php源码,白鹭/CDNDrive
  10. Oscache 概述
  11. Django 基础,创建一个Django,并成功在网页中运行
  12. 小米关联公司被列入经营异常
  13. python是脚本语言_python需要编译,为什么还把他叫做脚本语言?
  14. Linux之yum安装MySQL
  15. 安装Xcode的方法
  16. m低信噪比下GPS信号的捕获算法研究,使用matlab算法进行仿真
  17. canvas应用——圆角矩形图片
  18. HDOJ 最小长方形 1859
  19. Excel 2010 VBA 入门 095 数据处理之用数组实现分列
  20. 算法笔记(六)多尺度特征融合之FPN/PANet

热门文章

  1. 开源EDR(OSSEC)基础篇- 01 -设计定位与能力输出
  2. 央行的数字货币拥有政府信用背书,是法币并能利用交易留痕大数据来追踪
  3. 一次家里上不了网的解决过程
  4. 机遇和挑战并存 盛大的未来在云端
  5. 第五章:数学运算-math:数学函数-三角函数
  6. springboot日志管理+集成log4j
  7. 第四届“蓝帽杯”全国大学生网络安全 技能大赛 Writeup
  8. 如何打开无线网卡开关?
  9. 制作导航栏并使用CSS美化,CSS3样式创建一个漂亮简洁的导航栏
  10. 如何控制局域网网速_如何优化家中的网络设备,让你的网络最快?