博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
海量数据:判断一棵树是否为另一棵树的子树
阅读量:6949 次
发布时间:2019-06-27

本文共 1504 字,大约阅读时间需要 5 分钟。

T1是一棵含有几百万个节点的树,T2含有几百个节点。判断T2是否是T1 的子树。

首先考虑小数据量的情况,可以根据树的前序和中序遍历所得的字符串,来通过判断T2生成的字符串是否是T1字符串的子串,来判断T2是否是T1的子树。假设T1的节点数为N,T2的节点数为M。遍历两棵树算法时间复杂性是O(N + M), 判断字符串是否为另一个字符串的子串的复杂性也是O( N + M)(比如使用KMP算法)。所需要的空间也是O(N + M)。

这里有一个问题需要注意:对于左节点或者右节点为null的情况,需要在字符串中插入特殊字符表示。否则对于下面这种情形将会判断错误:

因此如果插入特殊字符,上述两棵树的中序和前序遍历的结果是相同的。

由于本例有几百万的节点,需要占用O(N + M)的内存。

如果换一种思路,就是遍历T1,每当T1的某个节点与T2的根节点值相同时,就判断两棵子树是否相同。这个算法的复杂度是O(N*M)。我们再仔细思考一下。因为只有在节点值与T2的根节点值相同才会调用O(M)。假设有K次这种情况,那么算法的复杂度就是O(N + K*M)。下面是代码实现:

struct TreeNode{	TreeNode *leftChild;	TreeNode *rightChild;	int data;};// check sub tree n1 == sub tree n2 bool checkSubTree(const TreeNode* n1, const TreeNode* n2){	if( n1 == nullptr && n2 == nullptr )		return true;		if( n1 == nullptr || n2 == nullptr )		return false;		if( n1->data != n2->data )		return false;		return checkSubTree(n1->leftChild, n2->leftChild) && checkSubTree(n1->rightChild, n2->rightChild);}bool subTree(const TreeNode *n1, const TreeNode *n2){	if( n1 == nullptr){		return false; // the bigger tree is empty, so t2 is not subtree of t1	}		if( n1->data == n2->data){		if( checkSubTree(n1, n2))			return true;	}		return subTree(n1->leftChild, n2) || subTree(n2->rightChild, n2);} 
对于上面讨论的2种解法,哪种解法比较好呢?其实有必要好好讨论一番:

1)方法一会占用O(N + M)的内存,而另外一种解法只会占用O(logN + logM)的内存(递归的栈内存)。当考虑scalability扩展性时,内存使用的多寡是个很重要的因素。

2)方法一的时间复杂度为O(N + M),方法二最差的时间复杂度是O(N*M)。所以要通过工程实践或者是历史数据看一下哪种方法更优。当然了,方法二也可能会很早发现两棵树的不同,早早的退出了checkSubTree。

总的来说,在空间使用上,方法二更好。在时间上,需要通过实际数据来验证。

转载于:https://www.cnblogs.com/wuwa/p/6190850.html

你可能感兴趣的文章
SVN版本冲突解决
查看>>
java多线程知识点汇总(四)多线程知识点脉络图
查看>>
nginx的upstream目前支持5种方式的分配
查看>>
android图像处理(3) 底片效果
查看>>
stl 之set图解
查看>>
HDU 3569 Imaginary Date 简单期望
查看>>
怎么清除火狐浏览器的cookie?
查看>>
连麦介绍
查看>>
MQTT 客户端源码分析
查看>>
IT思想类智力题
查看>>
php设计模式-单例模式
查看>>
php扩展php-redis安装与使用
查看>>
python一天一题(2)
查看>>
Win10下安装Ubuntu16.04虚拟机并搭建TensorFlow1.3环境
查看>>
leetcode 108. Convert Sorted Array to Binary Search Tree
查看>>
【商城购物车】购物车逻辑
查看>>
PCIE协议解析 synopsys IP loopback 读书笔记(1)
查看>>
创建maven工程的时候卡死的解决办法
查看>>
Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
查看>>
微信小程序保存图片功能实现
查看>>