• 36 二叉树中序遍历



    给定一个二叉树的根节点 root ,返回它的 中序 遍历 。

    在这里插入图片描述
    提示:

    • 树中节点数目在范围 [0, 100] 内
    • -100 <= Node.val <= 100

    进阶: 递归算法很简单,你可以通过迭代算法完成吗?

    题解1 递归

    /**
     * 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:
        vector<int> finalR;
        void inorder(TreeNode* root){
            if(! root) return;
    
            inorder(root->left);
            finalR.push_back(root->val);
            inorder(root->right);
        }
        vector<int> inorderTraversal(TreeNode* root) {
            if(! root ) return vector<int>();
            inorder(root);
            return finalR;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述

    题解2 迭代

    class Solution {
    public:
        vector<int> finalR;
        vector<int> inorderTraversal(TreeNode* root) {
            if(! root ) return vector<int>();
            // 弹栈符合中序遍历顺序
            stack<TreeNode*> kk;
            TreeNode* Lroot = root;
            while(Lroot){
                kk.push(Lroot);
                Lroot = Lroot->left;
            }
            while(kk.size()){
                auto k = kk.top();
                finalR.emplace_back(k->val);
                kk.pop();
                // 对每个点查右结点
                //(不需要再考虑左结点,因为此时该点左侧的点都已经检查完了)
                if(k->right){
                    k = k->right;
                    // 依旧是先左
                    while(k){
                        kk.push(k);
                        k = k->left;
                    }
                }
            }
    
            return finalR;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述

    迭代2(更简洁的改写)

    class Solution {
    public:
        vector<int> inorderTraversal(TreeNode* root) {
            vector<int> res;
            stack<TreeNode*> stk;
            while (root != nullptr || !stk.empty()) {
                // 左结点入栈
                while (root != nullptr) {
                    stk.push(root);
                    root = root->left;
                }
                root = stk.top();
                stk.pop();
                res.push_back(root->val);
                // 右结点入栈
                root = root->right;
            }
            return res;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

  • 相关阅读:
    2023腾讯云服务器价格表(轻量/CVM/免费/GPU)
    随便写一下
    鹅长微服务发现与治理巨作PolarisMesh实践-上
    K8S ingress nginx性能优化
    【Unity】URP屏幕后处理UI模糊效果实现
    【docker】配置深度学习环境
    Go Sync并发包之errgroup
    建造者模式
    毕业设计:基于深度学习的农产品价格预测系统 人工智能
    苏宁API:一键搜索,海量商品任你选!
  • 原文地址:https://blog.csdn.net/qq_43402798/article/details/133426619