輸入兩棵二叉樹A,B,判斷B是不是A的子結構(c++實現)


#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; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM