算法训练(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;
    }
};
相关推荐
.道阻且长.1 天前
2.LeetCode算法习题讲解--双指针--复写零
算法·leetcode·职场和发展
·薯条大王1 天前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
To_OC1 天前
LC 438 找到所有字母异位词:暴力超时后,我靠滑动窗口一招搞定
javascript·算法·leetcode
Forever Nore1 天前
学完C语言力扣第一题做不来正常吗
数据结构·算法
hansang_IR1 天前
【题解】LC:倍增 / 区间并查集(Range Parallel Unionfind)
c++·算法·并查集
东东最爱敲键盘1 天前
day7.c++继承
c++
沫璃染墨1 天前
《从零入门Linux系统篇(十五):系统工具篇·六——GDB调试器详解:从程序执行控制到高级调试技巧》
linux·运维·服务器·c语言·c++
吃着火锅x唱着歌1 天前
Effective C++ 学习笔记 条款40 明智而审慎地使用多重继承
c++·笔记·学习
Tisfy1 天前
LeetCode 3731.找出缺失的元素:哈希 / 排序
算法·leetcode·哈希算法·排序·哈希表