zoukankan      html  css  js  c++  java
  • Algorithm --> 判读是否是子树

    问题

    判断一棵树是否是另一棵树的子树,如图

    思路

    问题分两步:

    • 找值相同的根结点(遍历解决)
    • 判断两结点是否包含(递归:值、左孩子、右孩子分别相同)

    树节点定义

    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);
    }
  • 相关阅读:
    简介浏览器内核与JavaScript引擎
    一句SQL完成动态分级查询
    C# 语言习惯
    React的组件间通信
    React的学习(上)
    火狐浏览器所有的快捷键
    视频输出端口及颜色空间介绍
    live555
    ffplay的快捷键以及选项 FFmpeg 基本用法 FFmpeg常用基本命令 ffmpeg常用转换命令,支持WAV转AMR
    黑客技术资源
  • 原文地址:https://www.cnblogs.com/jeakeven/p/4607067.html
Copyright © 2011-2022 走看看