判断一个树是否是另外一个树的子树
2016-02-18 00:01
281 查看
很简单,假如说判断B是否为A的一个子树,则首先对A进行遍历,然后如果遍历时候节点的值等于B的根节点,则进入判断函数进行判断,如果完全一样,则该函数返回true,否则返回false,在后面递归判断时候,要判断前面函数返回的是true还是false,如果是true,则它的子树就不用再判断了,直接返回那个bool值,如果是false,则要对后面的左右子树依旧进行判断。
接下来讨论那个比较两棵树的函数,我们可以看到,如果假设B是A的子集,且设置两个指针,分别指向其两个树的根节点,二者同时开始进行遍历,可以看到有以下几种情况
A B 代号 bool值
有 空 甲 true
有 有 乙 看值是否相等来判断
空 空 丙 true
空 有 丁 false
空,就是遍历时候,当前节点为空,有意思就是,相反,当前节点不为空
上面这四种情况的目的在于如何让程序判断递归截止
对于乙情况,不用考虑,我们只考虑边界情况
甲丙丁三种情况,可以看到,在B为空时候,boo值为true,也就是说,B为A的
子树
而A为空且B为有的时候,才为false
if(A==NULL&&B!=NULL)
return false
if(B==NULL)
return true;
可以发现,上述代码可以优化为
if(B==NULL)
return true;
if(A==NULL)
return false
代码如下
接下来讨论那个比较两棵树的函数,我们可以看到,如果假设B是A的子集,且设置两个指针,分别指向其两个树的根节点,二者同时开始进行遍历,可以看到有以下几种情况
A B 代号 bool值
有 空 甲 true
有 有 乙 看值是否相等来判断
空 空 丙 true
空 有 丁 false
空,就是遍历时候,当前节点为空,有意思就是,相反,当前节点不为空
上面这四种情况的目的在于如何让程序判断递归截止
对于乙情况,不用考虑,我们只考虑边界情况
甲丙丁三种情况,可以看到,在B为空时候,boo值为true,也就是说,B为A的
#include <iostream> using namespace std; typedef struct _BiTree { int data; struct _BiTree *left; struct _BiTree *right; }BiTree,* PBiTree; PBiTree BuildTree() { int data; cin>>data; if(data==-1) return NULL; PBiTree p=(PBiTree )malloc(sizeof(BiTree)); p->data=data; p->left=BuildTree(); p->right=BuildTree(); return p; } void Print(PBiTree p) { if(p==NULL) return; cout<<p->data; Print(p->left); Print(p->right); } bool SameTree(PBiTree p1,PBiTree p2) { if(p2==NULL) return true; if(p1==NULL) return false; if(p1->data!=p2->data) return false; return SameTree(p1->left,p2->left)&&SameTree(p1->right,p2->right); } bool JudgeTree(PBiTree p1,PBiTree p2) { bool ret; if(p1==NULL||p2==NULL) return false; if(p1->data==p2->data) ret=SameTree(p1,p2); if(!ret) JudgeTree(p1->left,p2); if(!ret) JudgeTree(p1->right,p2); return ret; } int main() { PBiTree p1; PBiTree p2; p1=BuildTree(); Print(p1); p2=BuildTree(); Print(p2); if(JudgeTree) cout<<"2 is 1's subtree"<<endl; else cout<<"2 is 1's not subtree"<<endl; return 0; }
子树
而A为空且B为有的时候,才为false
if(A==NULL&&B!=NULL)
return false
if(B==NULL)
return true;
可以发现,上述代码可以优化为
if(B==NULL)
return true;
if(A==NULL)
return false
代码如下
相关文章推荐
- spring事务----编程式与声明式
- Linux下安装GCC5.3.0(亲测有效)
- Python重磅出击:19步铸造Python大师!
- VIEWGOOD(远古)校园流媒体应用平台解决方案
- eclipse快捷键
- qt music player-most simple version
- Java内部类【转】
- Sass进阶之路,之二(进阶篇)
- LeetCode 112. Path Sum
- Java RMI详解[转]
- 远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)
- JMS简介与ActiveMQ实战
- java 对象排序
- 学完平面设计培训课能赚到钱吗?
- magento插件开发,Mobilnik银行支付插件
- 如何修改Liferay的Session过期时间
- Oracle SQL 性能健康检查脚本 (SQLHC) (文档 ID 1626277.1)
- TQ210开发板安装QT交叉编译环境安装总结(转)
- Java多线程参考资料
- 通达OA助力老挝金木棉集团