算法训练(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;
    }
};
相关推荐
0x7F7F7F7F10 分钟前
算法竞赛数学知识大全
算法
superman超哥34 分钟前
仓颉锁竞争优化深度解析
c语言·开发语言·c++·python·仓颉
业精于勤的牙44 分钟前
最长特殊序列(二)
java·开发语言·算法
yong99901 小时前
C#实现OPC客户端与S7-1200 PLC的通信
开发语言·网络·算法·c#
yaoh.wang1 小时前
力扣(LeetCode) 111: 二叉树的最小深度 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·深度优先
charlie1145141911 小时前
快速在WSL上开发一般的C++上位机程序
开发语言·c++·笔记·学习·环境配置·工程
啊阿狸不会拉杆1 小时前
《数字图像处理》第 11 章 - 特征提取
图像处理·人工智能·算法·计算机视觉·数字图像处理
那雨倾城2 小时前
PiscCode实现用 YOLO 给现实世界加上「NPC 血条 HUD」
图像处理·python·算法·yolo·计算机视觉·目标跟踪
夏幻灵2 小时前
C++ 中手动重载赋值运算符(operator=)时实现部分复制的思路和方法
开发语言·c++·算法
九河云2 小时前
人工智能驱动企业数字化转型:从效率工具到战略引擎
人工智能·物联网·算法·机器学习·数字化转型