算法训练(leetcode)休息日 | 589. N 叉树的前序遍历、590. N 叉树的后序遍历、100. 相同的树、572. 另一棵树的子树

刷题记录

  • [589. N 叉树的前序遍历](#589. N 叉树的前序遍历)
  • [590. N 叉树的后序遍历](#590. N 叉树的后序遍历)
  • [100. 相同的树](#100. 相同的树)
  • [572. 另一棵树的子树](#572. 另一棵树的子树)

589. N 叉树的前序遍历

leetcode题目地址

前序遍历访问左右子树改为访问孩子列表元素。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

递归

cpp 复制代码
// c++
/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
public:
    void Order(Node* root, vector<int> &result){
        if(!root) return;
        result.emplace_back(root->val);
        for(int i=0; i<root->children.size(); i++)
            Order(root->children[i], result);
        
    }
    vector<int> preorder(Node* root) {
        vector<int> result;
        Order(root, result);
        return result;
    }
};

非递归

非递归前序遍历需要注意入栈顺序,栈是先进后出,所以要从右向左入栈孩子节点。

cpp 复制代码
// c++
/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
public:
    vector<int> preorder(Node* root) {
        if(!root) return {};
        stack<Node*> st;
        vector<int> result;
        st.push(root);
        while(!st.empty()){
            root = st.top();
            st.pop();
            result.emplace_back(root->val);
            for(int i=root->children.size()-1; i>=0; i--){
                st.push(root->children[i]);
            }
        }
        return result;
    }
};

590. N 叉树的后序遍历

leetcode题目地址

和二叉树后续遍历类似,不多赘述。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

cpp 复制代码
// c++
/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
public:
    void Order(Node* root, vector<int> &result){
        if(!root) return;
        
        for(int i=0; i<root->children.size(); i++)
            Order(root->children[i], result);
        result.emplace_back(root->val);
        
    }
    vector<int> postorder(Node* root) {
        vector<int> result;
        Order(root, result);
        return result;
    }
};

100. 相同的树

leetcode题目地址

同时遍历两棵树。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

cpp 复制代码
// c++
/**
 * Definition for a binary tree node.
 * 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 isSameTree(TreeNode* p, TreeNode* q) {
        if(!p && !q) return true;
        if(!p || !q) return false;
        if(p->val!=q->val) return false;
        bool left = isSameTree(p->left, q->left);
        bool right = isSameTree(p->right, q->right);
        return left && right;
    }
};

572. 另一棵树的子树

leetcode题目地址

同上题类似。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

cpp 复制代码
// c++
/**
 * Definition for a binary tree node.
 * 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 isSameTree(TreeNode* p, TreeNode* q) {
        if(!p && !q) return true;
        if(!p || !q) return false;
        if(p->val!=q->val) return false;
        bool left = isSameTree(p->left, q->left);
        bool right = isSameTree(p->right, q->right);
        return left && right;
    }
    bool isSubtree(TreeNode* root, TreeNode* subRoot) {
        if(!root && !subRoot) return true;
        if(!subRoot || !root) return false;
        if(root->val == subRoot->val) {
            bool isSame = isSameTree(root, subRoot);
            if(isSame) return isSame;
        }
        bool left = isSubtree(root->left, subRoot);
        bool right = isSubtree(root->right, subRoot);
        return left || right;
    }
};
相关推荐
zyl76543 分钟前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖4 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌4 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F5 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_307779135 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
AI wins5 小时前
c++新增頭文件
c++
Shadow(⊙o⊙)5 小时前
仿muduo实现高并发服务器——事件就绪管理Channel.hpp
服务器·c++
tomwang03225 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!5 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
by209995 小时前
哈希表——快速找到数据:冲突、删除与扩容的实现
数据结构·c++·哈希算法·散列表