随笔 - 112  文章 - 0  评论 - 0  阅读 - 1426

二叉树的中序遍历(递归/栈)

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

 

示例 1:

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

方法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> res;
    vector<int> inorderTraversal(TreeNode* root) {
        if(root){
            inorderTraversal(root->left);
            res.emplace_back(root->val);
            inorderTraversal(root->right);
        }
        return res;
    }
};
复制代码

 

方法2:借助栈的迭代方法

复制代码
/**
 * 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> inorderTraversal(TreeNode* root) {
        vector<int> res;  // 存储遍历结果的容器
        stack<TreeNode*> stk; // 辅助栈,用于存储节点以实现迭代式中序遍历
        // 当前节点非空 或者 栈不为空时继续循环
        while (!stk.empty() || root) {
            // 尽可能地遍历到最左边的节点,同时将沿途的所有节点压入栈中
            while (root != nullptr) {
                stk.push(root);
                root = root->left;
            }
            // 此时root为nullptr,表示已经到达最左端
            // 弹出栈顶元素(即当前子树的根节点),并访问它
            root = stk.top();
            res.emplace_back(root->val); // 将访问的节点值添加到结果列表中
            
            // 移动到右子树,开始处理右子树中的节点
            root = root->right;
            stk.pop(); // 弹出已访问的节点
        }
        return res; // 返回最终的遍历结果
    }
};
复制代码

拓展:

二叉树的前序遍历(借助栈的迭代方法)

复制代码
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;  // 存储遍历结果的容器
        stack<TreeNode*> stk; // 辅助栈,用于存储节点以实现迭代式前序遍历
        // 当前节点非空 或者 栈不为空时继续循环
        while (!stk.empty() || root) {
            while (root != nullptr) {
                //前序遍历根节点直接存放
                res.emplace_back(root->val);
                stk.push(root);
                root = root->left;
            }
            // 此时root为nullptr,表示已经到达最左端
            // 从栈顶节点的右节点开始处理右子树中的节点
            root = stk.top()->right;
            stk.pop(); 
        }
        return res; // 返回最终的遍历结果
    }
};
复制代码

二叉树的后序遍历(借助栈的迭代方法)

复制代码
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;  // 存储遍历结果的容器
        stack<TreeNode*> stk; // 辅助栈,用于存储节点以实现迭代式前序遍历
        // 当前节点非空 或者 栈不为空时继续循环
        while (!stk.empty() || root) {
            while (root != nullptr) {
                //前序遍历根节点直接存放
                res.emplace_back(root->val);
                stk.push(root);
                root = root->left;
            }
            // 此时root为nullptr,表示已经到达最左端
            // 从栈顶节点的右节点开始处理右子树中的节点
            root = stk.top()->right;
            stk.pop(); 
        }
        reverse(res.begin(),res.end()); // 取反即为后序遍历结果
        return res;
    }
};
复制代码

 

posted on   _月生  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

点击右上角即可分享
微信分享提示