一棵树是否为另一棵树的子树
问题描述:给定两个二叉树的根节点,判断第二树是否是第一个树的子树,如果是返回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;
}
一棵树是否为另一棵树的子树相关推荐
- 一棵树是否为另一棵树的子结构
题目描述 输入两颗二叉树A,B,判断B是不是A的子结构. 问题描述:给定两个二叉树的根节点,判断第二树是否是第一个树的子树,如果是返回1,否则返回0. 分析:这个是百度的一道笔试题目,属于经典的数据结 ...
- 海量数据:判断一棵树是否为另一棵树的子树
T1是一棵含有几百万个节点的树,T2含有几百个节点.判断T2是否是T1 的子树. 首先考虑小数据量的情况,可以根据树的前序和中序遍历所得的字符串,来通过判断T2生成的字符串是否是T1字符串的子串,来判 ...
- 二叉树 判断一棵树是否是另一棵树的子树
题目:判断判断一棵树是否是另一棵树的子树,子树的意思是只要包含了一个结点,就得包含这个结点下的所有节点.意思就是二叉树结点的值也要相等 如下图2就是1的子树 如果将第二颗树根节点右孩子data改为2 ...
- 判断一棵树是否为另一棵树的子树
题目如下: 判断一棵树是否为另一棵树的子树 思路: (1)先构建两棵树,a树和b树,判断b树是否为a树的子树 (2)构建两个方法,一个用来判断传入的两棵树是否相同,为isSameTree:另一个用来判 ...
- LeetCode高频题:戈壁滩种树,一排n棵树,至少有k棵树存活时,最终形成的风景线有多少不同的情况
LeetCode高频题:戈壁滩种树,一排n棵树,至少有k棵树存活时,最终形成的风景线有多少不同的情况 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是 ...
- Python 再说勾股树,这次整一棵五彩的任意“生长”的分形树!
上一篇<Turtle库画一棵对称勾股树,美丽惊艳的分形世界!>中描绘了一棵对称的双色勾股树,详情见:Python Turtle库画一棵对称勾股树,美丽惊艳的分形世界!_汉阳Hann's H ...
- 树的应用:求树的叶子节点数 求树的高度、copy一棵树
#if 0 //树的应用 //1.求树的叶子节点: 度为0的节点 //先判断根节点是否是叶子节点,然后计算左子树的叶子节点个数 //在计算 右子树节点个数void coutLeaf(BiNode *T ...
- 判断一棵树是否是另一棵树的子树 java实现
这是一个很经典的算法题,听起来好像挺难的,但是其实很简单.我觉得我们接触到的问题,并没有难题,只有复杂不复杂.一个再难的问题,也可以分解成一个个简单的问题,再将这些简单的问题交给不同的人去做就构成了一 ...
- 判断两个树是否相同判断一棵树是否是一棵树的子树
判断两棵树是否相同 方法:对两棵树同时做相同的递归判断其值或者是结构是否相同. 以下代码用的是前序遍历.递归方法(毕竟递归好理解而且代码少得可怜). 比较啰嗦的是指针为空的情况,只要把这些情况单独列出 ...
最新文章
- configure: error: newly created file is older than distributed files!
- 2013 Multi-University Training Contest 9 1011 Arc of Dream
- Bellman-Ford 算法 和 动态规划
- windows7不支持AllocateAndGetTcpExTableFromStack
- 用户登陆python脚本
- 20220208--CTF刷题记录--6道简单的MISC题目
- Python版——博客网站四 编写日志创建页
- 复习Object类_日期时间类_System类_StringBuilder_包装类以及各类的细节
- 白鹭php源码,白鹭/CDNDrive
- Oscache 概述
- Django 基础,创建一个Django,并成功在网页中运行
- 小米关联公司被列入经营异常
- python是脚本语言_python需要编译,为什么还把他叫做脚本语言?
- Linux之yum安装MySQL
- 安装Xcode的方法
- m低信噪比下GPS信号的捕获算法研究,使用matlab算法进行仿真
- canvas应用——圆角矩形图片
- HDOJ 最小长方形 1859
- Excel 2010 VBA 入门 095 数据处理之用数组实现分列
- 算法笔记(六)多尺度特征融合之FPN/PANet
热门文章
- 开源EDR(OSSEC)基础篇- 01 -设计定位与能力输出
- 央行的数字货币拥有政府信用背书,是法币并能利用交易留痕大数据来追踪
- 一次家里上不了网的解决过程
- 机遇和挑战并存 盛大的未来在云端
- 第五章:数学运算-math:数学函数-三角函数
- springboot日志管理+集成log4j
- 第四届“蓝帽杯”全国大学生网络安全 技能大赛 Writeup
- 如何打开无线网卡开关?
- 制作导航栏并使用CSS美化,CSS3样式创建一个漂亮简洁的导航栏
- 如何控制局域网网速_如何优化家中的网络设备,让你的网络最快?