判斷一棵樹是否是另一棵樹的子樹


問題

判斷一棵樹是否是另一棵樹的子樹,如圖

思路

問題分兩步:

  • 找值相同的根結點(遍歷解決)
  • 判斷兩結點是否包含(遞歸:值、左孩子、右孩子分別相同)

樹節點定義

struct TreeNode
{
    int val;
    TreeNode *next;
    TreeNode(int v) : val(v), next(NULL) {}
};

代碼

bool IsPart(TreeNode *root1, TreeNode *root2)
{
    if (root2 == NULL)
        return true;
    if (root1 == NULL)
        return false;
    if (root1->val != root2->val)
        return false;
    return IsPart(root1->left, root2->left) &&
        IsPart(root1->right, root2->right);
}
bool IsPartTree(TreeNode *root1, TreeNode *root2)
{
    bool result = false;
    if (root1 != NULL && root2 != NULL)
    {
        if (root1->val == root2->val)
            result = IsPart(root1, root2);
        if (!result)
            result = IsPartTree(root1->left, root2);
        if (!result)
            result = IsPartTree(root1->right, root2);
    }
    return result;
}

執行

#include <iostream>
#include <stack>
using namespace std;
struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int v) : val(v), left(NULL), right(NULL) {}
};
bool IsPart(TreeNode *root1, TreeNode *root2)
{
    if (root2 == NULL)
        return true;
    if (root1 == NULL)
        return false;
    if (root1->val != root2->val)
        return false;
    return IsPart(root1->left, root2->left) &&
        IsPart(root1->right, root2->right);
}
bool IsPartTree(TreeNode *root1, TreeNode *root2)
{
    bool result = false;
    if (root1 != NULL && root2 != NULL)
    {
        if (root1->val == root2->val)
            result = IsPart(root1, root2);
        if (!result)
            result = IsPartTree(root1->left, root2);
        if (!result)
            result = IsPartTree(root1->right, root2);
    }
    return result;
}
TreeNode* createTree1()
{
    TreeNode *root = new TreeNode(1);
    TreeNode *p1 = new TreeNode(2);
    TreeNode *p2 = new TreeNode(3);
    TreeNode *p3 = new TreeNode(4);
    TreeNode *p4 = new TreeNode(5);
    root->left = p1;
    root->right = p2;
    p2->left = p3;
    p2->right = p4;
    return root;
}
TreeNode* createTree2()
{
    TreeNode *root = new TreeNode(1);
    TreeNode *p1 = new TreeNode(2);
    TreeNode *p2 = new TreeNode(3);
    root->left = p1;
    root->right = p2;
    return root;
}


void deleteTree(TreeNode *root)
{
    if (root != NULL)
    {
        delete(root->left);
        delete(root->right);
        delete root;
        root = NULL;
    }
}
int main()
{
    TreeNode *root1 = createTree1();
    TreeNode *root2 = createTree2();
    cout << IsPartTree(root1, root2) << endl;
    deleteTree(root1);
    deleteTree(root2);
}
View Code

 

推薦

算法與數據結構索引

 


免責聲明!

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



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