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

给定一个二叉树的根节点 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 2024-12-23 19:03  _月生  阅读(42)  评论(0)    收藏  举报