给定一个二叉树的根节点 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
移动到右子树节点,继续进行下一个循环。