#include <iostream> #include <cstdio> #include <stdio.h> #include <string> #include <queue> #include <stack>
using namespace std; class Node{ public : char data; struct Node *lchild,*rchild; }; class BiTree{ public: Node * root;//頭結點
int height=0;//樹的高度
BiTree() {root=NULL;} //層序創建二叉樹
void create_level(string &s) { int p=0; root=new Node(); Node *t,*i,*j; queue<Node*> qTree;//定義一個隊列,存儲節點
while(true) { if(p==s.size())break; if(p==0)//當頭結點未創建
{ t=new Node(); t->data=s[p]; qTree.push(t);//頭結點進隊
root=t; p++; } else { t=qTree.front();//該節點出隊
if(p==s.size())break;//樹的構建完畢
if(s[p]=='#')//不存在左節點
{ t->lchild=NULL; p++; } else//存在左節點
{ i=new Node(); i->data=s[p]; t->lchild=i;//左節點進隊
qTree.push(i); p++; } if(p==s.size())break; if(s[p]=='#')//不存在右節點
{ t->rchild=NULL; p++; } else//存在右節點
{ j=new Node(); j->data=s[p]; t->rchild=j; qTree.push(j); p++; } qTree.pop();//節點左右節點已創建,該節點出隊
} } } }; class Solution { bool isSubtree(Node* pRootA,Node* pRootB) { /*以下if語句不能調換,如果調換返回結果都為false *比如: A樹:123 B樹:123 * 在遍歷兩樹的節點2時,遞歸進入下一次,兩樹的節點2的左節點都為NULL,進入遞歸 * 此時pRootA=NULL、pRootB=NULL,如果pRootA==NULL放在前面,返回false */
if(pRootB==NULL) return true; if(pRootA==NULL) return false; if(pRootA->data==pRootB->data) { //如果樹A樹B節點值相等,繼續遞歸遍歷他們的左右節點是否相等
return isSubtree(pRootA->lchild,pRootB->lchild)&& isSubtree(pRootA->rchild,pRootB->rchild); } else return false; } public: bool HasSubtree(Node* pRootA,Node* pRootB) { if(pRootA==NULL||pRootB==NULL)return false; //從樹A的該節點開始遍歷看是否與B節點的根值是否相同 || 比較樹A的該節點的左節點與樹B的根節點 || 比較樹A的該節點的右節點與樹B的根節點
return isSubtree(pRootA,pRootB)||HasSubtree(pRootA->lchild,pRootB)||HasSubtree(pRootA->rchild,pRootB); } }; int main() { BiTree a,b; string s1,s2; s1="88792####47"; a.create_level(s1); s2="892"; b.create_level(s2); Solution s; bool bo=s.HasSubtree(a.root,b.root); cout<<bo<<endl; return 0; }