判断树T2是否为T1的子树
来源:互联网 发布:md5算法java实现 编辑:程序博客网 时间:2024/04/30 10:44
题目
你有两颗非常大的二叉树:T1,有几百万个节点;T2有几百个节点。
设计一个算法,判断T2是否为T1的子树。
如果T1有一个节点n,其子树与T2一模一样,则T2为T1的子树。也就是说,从节点n
处把树砍断,得到的树与T2完全相同。
设计一个算法,判断T2是否为T1的子树。
如果T1有一个节点n,其子树与T2一模一样,则T2为T1的子树。也就是说,从节点n
处把树砍断,得到的树与T2完全相同。
分析
方法一:在规模较小且较简单的问题中,我们可以创建一个字符串,表示中序和前序遍历结果。若T2的前序遍历是T1前序遍历的子串,并且T2中序遍历是T1中序遍历的子串,则T2是T1的子树。
利用后缀树可以在线性时间内检查是否为子串,因此就最差情况的时间复杂度而言,这个算法是相当高效的。但是就本题而言,数据量过大,空间开销过大。
方法二:搜索较大的树T1,每当T1的某个节点与T2的根节点相同时,就调用matchTree方法判断T1子树与T2是否完全匹配;
代码
/*题目:你有两颗非常大的二叉树:T1,有几百万个节点;T2有几百个节点。设计一个算法,判断T2是否为T1的子树。如果T1有一个节点n,其子树与T2一模一样,则T2为T1的子树。也就是说,从节点n处把树砍断,得到的树与T2完全相同。*/#include <iostream>#include <cstdlib>#include <vector>#include <queue>using namespace std;/*二叉树节点数据结构*/struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}};const int flag = INT_MAX;TreeNode *generateTree(vector<int> &nums){if (nums.empty())return NULL;TreeNode *root = new TreeNode(nums[0]);queue<TreeNode *> que;que.push(root);//求出所给元素个数,对应二叉查找树节点个数int size = nums.size();for (int i = 1; i < size; i += 2){//处理队首节点的左右子树TreeNode *tmp = que.front();TreeNode *left = NULL, *right = NULL;//定义非空左子树if (nums[i] != flag){left = new TreeNode(nums[i]);que.push(left);}//定义非空右子树if (i + 1 < size && nums[i + 1] != flag){right = new TreeNode(nums[i + 1]);que.push(right);}tmp->left = left;tmp->right = right;//弹出当前处理的节点que.pop();}return root;}class Solution {public:bool containsTree(TreeNode *t1, TreeNode *t2){if (t2 == NULL)return true;return subTree(t1, t2);}/*判断t2是否为t1的子树*/bool subTree(TreeNode *t1, TreeNode *t2){if (t1 == NULL)return false;if (t1->val == t2->val)return matchTree(t1, t2);elsereturn subTree(t1->left, t2) || subTree(t1->right, t2);}/*判断两颗树是否完全一致*/bool matchTree(TreeNode *t1, TreeNode *t2){if (t1 == NULL && t2 == NULL)return true;else if (t1 == NULL || t2 == NULL)return false;else if (t1->val != t2->val)return false;elsereturn matchTree(t1->left, t2->left) && matchTree(t1->right, t2->right);}};int main(){vector<int> v1 = { 7, 6, flag, 4, flag, 2, 5, 8, 3, flag, flag, flag, flag, flag, flag };TreeNode *t1 = generateTree(v1);vector<int> v2 = {2, 8, 3};TreeNode *t2 = generateTree(v2);cout << Solution().containsTree(t1, t2) << endl;system("pause");return 0;}
0 0
- 判断树T2是否为T1的子树
- Tree_Graph 判断T2是否为T1的子树 @CareerCup
- 020给定两个二叉树T1,T2判断T1是否是T2的子树(keep it up)
- 判断t1树中是否有与t2树拓扑结构完全相同的子树
- 判断t1树是否有与t2树拓扑结构完全相同的子树
- 二叉树问题---判断t1树中是否有与t2树拓扑结构完全相同的子树
- 判断tl树中是否有与t2树拓扑结构完全相同的子树
- 判断是否为子树
- 二叉树问题---判断t1树是否包含t2树全部的拓扑结构
- 判断t1树是否包含t2树全部相同的拓扑结构
- 判断t1树是否包含t2树全部的拓扑结构
- 判断一个树是否为另一棵树的子树
- 判断一个树是否为另一个树的子树
- 判断一个树是否为另一个树的子树
- C++ 判断是否为2叉树的子树
- 判断一棵树是否为另一棵树的子树
- 判断二叉树是否为子树
- 判定T2 是不是T1 的子树(算法)
- mysql 汇总数据 学习笔记
- 机器学习环境搭建:GTX970+Ubutnu1404_64bit+TensorFlow(GPU)
- POJ-1611 并查集-The Suspects
- 微信H5支付开发步骤
- iOS 知识小集(横竖屏切换)
- 判断树T2是否为T1的子树
- JQuery初识
- 装载问题——搜索回溯算法
- C++编程好习惯
- 微信H5支付开发步骤
- 理解javascript中this的指向(简单理解篇)
- iOS9下代码创建约束
- POJ 1979 Red and Black
- java project build failed for javadoc error