题目:
写出二叉树的迭代版的中序遍历
方法:
中序遍历的顺序是左中右,因此处理逻辑与前序遍历很不相同,前序遍历中我们指针指向要进栈的节点就是我们即将要处理的节点,但是在中序遍历中处理的节点与我们所访问的节点不是一致的。我们需要一路遍历根节点的左节点的左节点一直到空为止,然后处理最后一个左节点,将其出栈并放入结果数组中并判断其是否还有右节点,如果有的话就进栈,没有的话就继续出栈下一个元素并判断其是否有右节点。重复这样的过程直到栈内元素为空就结束了。
题解:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
TreeNode* cur = root;
while (cur != NULL || !st.empty()) {
if (cur != NULL) { // 指针来访问节点,访问到最底层
st.push(cur); // 将访问的节点放进栈
cur = cur->left; // 左
} else {
cur = st.top(); // 从栈里弹出的数据,将其加入结果数组中
st.pop();
result.push_back(cur->val); // 中
cur = cur->right; // 右
}
}
return result;
}
};