LeetCode 力扣 热题 100道(十四)二叉树的中序遍历(C++)

发布于:2024-12-06 ⋅ 阅读:(52) ⋅ 点赞:(0)

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

如下为代码:

/**
 * 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> result;
        stack<TreeNode*> stk;
        TreeNode* curr = root;
        while (curr != nullptr || !stk.empty()) {
            while (curr != nullptr) {
                stk.push(curr);
                curr = curr->left;
            }
            curr = stk.top();
            stk.pop();
            result.push_back(curr->val);
            curr = curr->right;
        }
        return result;
    }
};
  • vector<int> result; 用来存储中序遍历的结果。
  • stack<TreeNode*> stk; 用来模拟递归过程中访问的栈。
  • TreeNode* curr = root;curr 初始化为二叉树的根节点,用来遍历树。
  • while (curr != nullptr || !stk.empty()):这个循环会一直进行,直到遍历完所有节点。条件判断包括两部分:
  • curr != nullptr:表示当前节点还存在。
  • !stk.empty():表示栈不为空,说明还有节点待访问。
  • while (curr != nullptr):这个内层循环将沿着左子树访问,直到当前节点为空。
  • 在每一步,当前节点 curr 会被压入栈中 (stk.push(curr);),然后将 curr 移动到左子节点 (curr = curr->left;)。
  • 当左子树遍历完毕后,栈顶的节点就是当前最左的节点。
  • curr = stk.top(); 从栈中取出栈顶节点,即当前最左的节点。
  • stk.pop(); 弹出栈顶节点,因为这个节点已经被访问过。
  • result.push_back(curr->val); 将当前节点的值添加到结果数组中。
  • curr = curr->right;curr 移动到右子树节点,继续进行下一个循环。

网站公告

今日签到

点亮在社区的每一天
去签到

热门文章