判斷一個節點是否在一棵二叉樹中和判斷一顆二叉樹是否是另一顆樹的子樹——題集(十二)

判斷一個節點是否在一棵二叉樹中和判斷一顆二叉樹是否是另一顆樹的子樹——題集(十二)

       今天分享一下,判斷一個節點是否在一棵二叉樹中和判斷一顆二叉樹是否是另一顆樹的子樹

      判斷一個節點是否在一棵二叉樹中的源代碼和運行示例。

     說明:節點爲空,默認結點在二叉樹中;二叉樹爲空,默認結點不在二叉樹中。本程序默認對比結點的值,所以該二叉樹中最好沒有有重複值的結點。

源代碼如下:

#include<iostream>
using namespace std;
 
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x)
:val(x)
,left(NULL)
,right(NULL)
{
    }
};
 
//判斷一個節點是否在一棵二叉樹中
bool _IsPointExit(TreeNode*  root,const TreeNode* point){//前序遍歷求解一遍
if(root==NULL) return false;
 
if(root->val ==point->val ) return true;
 
if(!_IsPointExit( root->left, point)){
return _IsPointExit( root->right, point);
}
return true;
}
bool IsPointExit(TreeNode*  root,const TreeNode*  point){//判斷一個節點是否在一棵二叉樹中
if(point==NULL) return true;
TreeNode*  proot=root;
 
return _IsPointExit( proot, point);
}
 
void Print(TreeNode* pRoot) {//層序遍歷打印
queue<TreeNode*> cur;
    if(pRoot==NULL) return ;
    cur.push(pRoot);
 
    while(!cur.empty()){
        TreeNode* point=cur.front();
        cur.pop();
        cout<<point->val<<" ";
 
        if(point->left != NULL)
        cur.push(point->left);
        
if(point->right != NULL)
            cur.push(point->right);
    }
cout<<endl;
 
    return;
}
 
void TestTree(){//判斷一個節點是否在一棵二叉樹中
TreeNode * pRoot1=new TreeNode(1);
TreeNode * pRoot2=new TreeNode(2);
TreeNode * pRoot3=new TreeNode(3);
TreeNode * pRoot4=new TreeNode(4);
TreeNode * pRoot5=new TreeNode(5);
TreeNode * pRoot6=new TreeNode(6);
TreeNode * pRoot7=new TreeNode(7);
TreeNode * pRoot8=new TreeNode(8);
TreeNode * pRoot9=new TreeNode(9);
 
pRoot1->left = pRoot2;
pRoot1->right = pRoot3;
pRoot2->left = pRoot4;
pRoot2->right = pRoot5;
pRoot3->left = pRoot6;
pRoot3->right = pRoot7;
pRoot4->left = pRoot8;
pRoot4->right = pRoot9;
 
TreeNode * root0=new TreeNode(11);
 
cout<<"判斷一個節點是否在一棵二叉樹中"<<endl;
cout<<"********************************"<<endl<<endl;
cout<<"打印二叉樹pRoot1:";
Print(pRoot1);
cout<<"pRoot1節點的值爲: "<<pRoot1->val<<",IsPointExit(pRoot1,pRoot1): "<<IsPointExit(pRoot1,pRoot1)<<endl;
cout<<"pRoot2節點的值爲: "<<pRoot2->val<<",IsPointExit(pRoot1,pRoot2): "<<IsPointExit(pRoot1,pRoot2)<<endl;
cout<<"pRoot3節點的值爲: "<<pRoot3->val<<",IsPointExit(pRoot1,pRoot3): "<<IsPointExit(pRoot1,pRoot3)<<endl;
cout<<"pRoot4節點的值爲: "<<pRoot4->val<<",IsPointExit(pRoot1,pRoot4): "<<IsPointExit(pRoot1,pRoot4)<<endl;
cout<<"pRoot5節點的值爲: "<<pRoot5->val<<",IsPointExit(pRoot1,pRoot5): "<<IsPointExit(pRoot1,pRoot5)<<endl;
cout<<"pRoot6節點的值爲: "<<pRoot6->val<<",IsPointExit(pRoot1,pRoot6): "<<IsPointExit(pRoot1,pRoot6)<<endl;
cout<<"pRoot7節點的值爲: "<<pRoot7->val<<",IsPointExit(pRoot1,pRoot7): "<<IsPointExit(pRoot1,pRoot7)<<endl;
cout<<"pRoot8節點的值爲: "<<pRoot8->val<<",IsPointExit(pRoot1,pRoot8): "<<IsPointExit(pRoot1,pRoot8)<<endl;
cout<<"pRoot9節點的值爲: "<<pRoot9->val<<",IsPointExit(pRoot1,pRoot9): "<<IsPointExit(pRoot1,pRoot9)<<endl;
cout<<"root0節點的值爲: "<<root0->val<<",IsPointExit(pRoot1,root0): "<<IsPointExit(pRoot1,root0)<<endl;
 
cout<<"********************************"<<endl<<endl;
}
 
int main(){
TestTree();//判斷一個節點是否在一棵二叉樹中
system("pause");
return 0;
}

運行結果:


  

     判斷一顆二叉樹是否是另一顆樹的子樹的源代碼和運行示例。

     如圖:tree2tree1的子樹。


源代碼如下:

#include<iostream>
using namespace std;
 
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x)
:val(x)
,left(NULL)
,right(NULL)
{
    }
};
 
bool _IsChildTree(TreeNode* T1,TreeNode* T2){//前序遍歷求解一遍
if(T2==NULL && T1==NULL) return true;
if(T1==NULL || T2==NULL) return false;
 
if(T1->val == T2->val){
if(_IsChildTree(T1->left, T2->left)){//左樹相同繼續求解右樹
return _IsChildTree(T1->right, T2->right);
}
}
return false;
}
 
bool _Find(TreeNode* T1,TreeNode* T2){
if(T1==NULL) return false;
 
if(T1->val == T2->val){
if(_IsChildTree(T1, T2)){
return true;
}
}
if(!_Find(T1->left, T2)){
return _Find(T1->right, T2);
}
return true;
}
 
//一顆二叉樹是否是另一顆樹的子樹
bool IsChildTree(TreeNode*  T1, TreeNode*  T2){//一顆二叉樹是否是另一顆樹的子樹
//找到重合的第一個點,入口——中序遍歷一遍
if(T2==NULL) return true;
if(T1==NULL) return false;
 
TreeNode* t1= T1;
TreeNode* t2= T2;
 
return _Find(t1,t2);
}
 
void _PrePrint(TreeNode* root)//先序打印
{
if(root==NULL) return;
 
cout<<root->val<<" ";
_PrePrint(root->left);
_PrePrint(root->right);
}
 
void TestTree(){//一顆二叉樹是否是另一顆樹的子樹
TreeNode * pRoot1=new TreeNode(1);
TreeNode * pRoot2=new TreeNode(2);
TreeNode * pRoot3=new TreeNode(3);
TreeNode * pRoot4=new TreeNode(4);
TreeNode * pRoot5=new TreeNode(5);
TreeNode * pRoot6=new TreeNode(6);
TreeNode * pRoot7=new TreeNode(7);
TreeNode * pRoot8=new TreeNode(8);
TreeNode * pRoot9=new TreeNode(9);
 
pRoot1->left = pRoot2;
pRoot1->right = pRoot3;
pRoot2->left = pRoot4;
pRoot2->right = pRoot5;
pRoot3->left = pRoot6;
pRoot3->right = pRoot7;
pRoot4->left = pRoot8;
pRoot4->right = pRoot9;
 
TreeNode * root0=new TreeNode(11);
TreeNode * root1=new TreeNode(3);
TreeNode * root2=new TreeNode(4);
TreeNode * root4=new TreeNode(6);
TreeNode * root5=new TreeNode(7);
TreeNode * root6=new TreeNode(8);
 
root0->left = root1;
root0->right = root2;
root1->left = root4;
root1->right = root5;
root2->left = root6;
 
cout<<"一顆二叉樹是否是另一顆樹的子樹"<<endl;
cout<<"********************************"<<endl<<endl;
 
cout<<"先序打印二叉樹pRoot1:";
_PrePrint(pRoot1);
cout<<endl;
cout<<"IsChildTree(pRoot1, pRoot1): "<<IsChildTree(pRoot1, pRoot1)<<endl;//一顆二叉樹是否是另一顆樹的子樹
cout<<"IsChildTree(pRoot1, pRoot2): "<<IsChildTree(pRoot1, pRoot2)<<endl;
cout<<"IsChildTree(pRoot1, pRoot3): "<<IsChildTree(pRoot1, pRoot3)<<endl;
cout<<"IsChildTree(pRoot1, pRoot4): "<<IsChildTree(pRoot1, pRoot4)<<endl;
cout<<"IsChildTree(pRoot1, pRoot5): "<<IsChildTree(pRoot1, pRoot5)<<endl;
cout<<"IsChildTree(pRoot1, pRoot6): "<<IsChildTree(pRoot1, pRoot6)<<endl;
cout<<"IsChildTree(pRoot1, pRoot7): "<<IsChildTree(pRoot1, pRoot7)<<endl;
cout<<"IsChildTree(pRoot1, pRoot8): "<<IsChildTree(pRoot1, pRoot8)<<endl;
cout<<"IsChildTree(pRoot1, pRoot9): "<<IsChildTree(pRoot1, pRoot9)<<endl;
cout<<"********************************"<<endl<<endl;
 
 
cout<<"先序打印二叉樹pRoot1:";
_PrePrint(pRoot1);//先序打印
cout<<endl;
cout<<"先序打印二叉樹root0:";
_PrePrint(root0);
cout<<endl;
cout<<"IsChildTree(pRoot1, root0): "<<IsChildTree(pRoot1, root0)<<endl;
cout<<endl<<endl;
 
cout<<"先序打印二叉樹pRoot1:";
_PrePrint(pRoot1);
cout<<endl;
cout<<"先序打印二叉樹root1:";
_PrePrint(root1);
cout<<endl;
cout<<"IsChildTree(pRoot1, root1): "<<IsChildTree(pRoot1, root1)<<endl;
cout<<endl<<endl;
 
cout<<"先序打印二叉樹pRoot1:";
_PrePrint(pRoot1);
cout<<endl;
cout<<"先序打印二叉樹root2:";
_PrePrint(root2);
cout<<endl;
cout<<"IsChildTree(pRoot1, root2): "<<IsChildTree(pRoot1, root2)<<endl;
cout<<endl<<endl;
 
cout<<"********************************"<<endl<<endl;
}
 
int main(){
TestTree();//一顆二叉樹是否是另一顆樹的子樹
system("pause");
return 0;
}

運行結果:



 

      分享如上,如有錯誤,望斧正!願大家學得開心,共同進步!

發佈了72 篇原創文章 · 獲贊 15 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章