力扣——572.另一个树的子树

题目:

思路:

深度优先搜索,遍历root的每一个节点代表的整棵树是否和subroot一样。比较是否一样的时候可以从根节点开始递归,首先查看是否为空,然后值是否一样。

代码:

vs可运行代码:

要定义一下二叉树节点

cpp 复制代码
#include <iostream>
#include<vector>
using namespace std;

// 二叉树的定义
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) {}
};

class Solution {
public:
    bool check(TreeNode *s, TreeNode *t) {
        //两者空 T
        if (!s && !t) {
            return true;
        }
        //其中一个空 F
        //root值不一样 F
        if (!s || !t || s->val != t->val) {
            return false;
        }
        
        //return 递归  s的左和t的左 && s的右和t的右
        return check(s->left, t->left) && check(s->right, t->right);
    }

    bool dfs(TreeNode *s, TreeNode *t) {
        return check(s, t) || dfs(s->left, t) || dfs(s->right, t);
    }

    bool isSubtree(TreeNode *s, TreeNode *t) {
        return dfs(s, t);
    }
};

// 辅助函数:创建二叉树
TreeNode* createTree(vector<int>& values, int index) {
    if (index >= values.size() || values[index] == -1) {
        return nullptr;
    }
    TreeNode* root = new TreeNode(values[index]);
    root->left = createTree(values, 2 * index + 1);
    root->right = createTree(values, 2 * index + 2);
    return root;
}

// 辅助函数:删除二叉树
void deleteTree(TreeNode* root) {
    if (root) {
        deleteTree(root->left);
        deleteTree(root->right);
        delete root;
    }
}

int main() {
    // 创建示例树
    vector<int> rootValues = { 3, 4, 5, 1, 2 }; // 这里使用-1表示空节点
    vector<int> subRootValues = { 4, 1, 2 };

    TreeNode* root = createTree(rootValues, 0);
    TreeNode* subRoot = createTree(subRootValues, 0);

    Solution sol;
    bool result = sol.isSubtree(root, subRoot);
    cout << "Is subRoot a subtree of root? " << (result ? "Yes" : "No") << endl;

    // 清理内存
    deleteTree(root);
    deleteTree(subRoot);

    return 0;
}

力扣代码:

cpp 复制代码
class Solution {
public:
    bool check(TreeNode *o, TreeNode *t) {
        if (!o && !t) {
            return true;
        }
        if ((o && !t) || (!o && t) || (o->val != t->val)) {
            return false;
        }
        return check(o->left, t->left) && check(o->right, t->right);
    }

    bool dfs(TreeNode *o, TreeNode *t) {
        if (!o) {
            return false;
        }
        return check(o, t) || dfs(o->left, t) || dfs(o->right, t);
    }

    bool isSubtree(TreeNode *s, TreeNode *t) {
        return dfs(s, t);
    }
};

小结:感觉今天和lhw交流他说的很有道理,LeetCode的每日一题可以当作学习使用(不需要绞尽脑汁去费劲想,思考一下思路直接看题解);而LeetCode100题是循序渐进的过程。

所以决定接下来的日子里,主攻100题,每日一题当作放松!

相关推荐
Pandaconda1 小时前
【C++ 面试 - 新特性】每日 3 题(六)
开发语言·c++·经验分享·笔记·后端·面试·职场和发展
阿拉伯的劳伦斯2921 小时前
LeetCode第一题(梦开始的地方)
数据结构·算法·leetcode
Mr_Xuhhh1 小时前
C语言深度剖析--不定期更新的第六弹
c语言·开发语言·数据结构·算法
日记成书1 小时前
【无线通信发展史⑨】1791年路易吉·伽伐尼-关于动物电的研究与1800年亚历山大·伏打伯爵-电池:伏打电池
网络·人工智能·学习·职场和发展·信息与通信
吵闹的人群保持笑容多冷静2 小时前
2024CCPC网络预选赛 I. 找行李 【DP】
算法
桃酥4032 小时前
算法day22|组合总和 (含剪枝)、40.组合总和II、131.分割回文串
数据结构·c++·算法·leetcode·剪枝
山脚ice2 小时前
【Hot100】LeetCode—55. 跳跃游戏
算法·leetcode
桃酥4032 小时前
算法day21|回溯理论基础、77. 组合(剪枝)、216.组合总和III、17.电话号码的字母组合
java·数据结构·c++·算法·leetcode·剪枝
小丁爱养花2 小时前
DFS算法专题(一)——二叉树中的深搜【回溯与剪枝的初步注入】
java·开发语言·算法·leetcode·深度优先·剪枝
伏城之外2 小时前
LeetCode - 15 三数之和
java·javascript·c++·python·leetcode·c