4.8 你有两棵非常大的二叉树:T1,有几百万个结点;T2,有几百个结点。设计一个算法,判断T2是否为T1的子树。
如果T1有这么一个结点n,其子树与T2一模一样,则T2是T1的子树。也就是说,从结点n处把树砍掉,得到的树与T2完全相同。
C++实现代码:
#include<iostream> #include<new> #include<cmath> using namespace std; //Definition for binary tree struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; void createTree(TreeNode *&root) { int i; cin>>i; if(i!=0) { TreeNode *tmp=new TreeNode(i); root=tmp; createTree(root->left); createTree(root->right); } } bool isSubTree(TreeNode *root1,TreeNode *root2) { //root2为空时是任何数的子树 if(root2==NULL) return true; //如果root2不为空,但是root1为空,则返回false if(root1==NULL) return false; if(root1->val==root2->val) return isSubTree(root1->left,root2->left)&&isSubTree(root1->right,root2->right); else return isSubTree(root1->left,root2)||isSubTree(root1->right,root2); return false; } int main() { TreeNode *root1=NULL; TreeNode *root2=NULL; createTree(root1); createTree(root2); cout<<isSubTree(root1,root2)<<endl; }
时间: 2024-11-04 06:51:47