文章内容是自己刷leetcode题目的一些总结。
文章内容参考公众号: 代码随想录。
一.前言
在上篇文章二叉树的迭代遍历中我们分析了二叉树的迭代遍历方法,发现前中后序的迭代遍历方法没有一个统一的写法,今天这篇文章我们来解决这个问题,寻找一种统一的迭代写法。
二.二叉树迭代遍历统一写法
问题: 无法同时解决访问节点与处理节点不一致的情况
解决办法: 标记法。我们将访问的节点放入栈中,把要处理的节点也放入栈中同时进行标记,标记方法就是把要处理的节点放入栈中后,接着加入一个空指针作为标记。
1.中序遍历
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
//中序遍历迭代法统一形式:
//将要处理的节点入栈后,再入栈一个空指针,那么我们出栈时遇到空指针就知道下一个就是结果答案
vector<int> ans;
if(root == nullptr) {
return ans;
}
stack<TreeNode*> myStack;
myStack.push(root);
while(!myStack.empty()) {
TreeNode* node = myStack.top();
if(node != nullptr) {
myStack.pop();//先出栈,然后按照右中左的顺序入栈
if(node->right != nullptr) { //右
myStack.push(node->right);
}
myStack.push(node); //中
myStack.push(nullptr); //在要处理的节点后入栈一个空指针
if(node->left != nullptr) { //左
myStack.push(node->left);
}
} else { //遇到空指针说明遇到了要处理的元素,加入到结果中
myStack.pop(); //弹出空指针
ans.push_back(myStack.top()->val);
myStack.pop(); //弹出处理过的元素
}
}
return ans;
}
};
2.前序遍历
vector preorderTraversal(TreeNode* root) { //前序遍历:中左右
vector<int> ans;
if(root == nullptr) return ans;
stack<TreeNode*> myStack;
myStack.push(root);
while(!myStack.empty()) {
TreeNode* node = myStack.top();
if(node != nullptr) { //按照右左中入栈
myStack.pop();
if(node->right) myStack.push(node->right); //右
if(node->left) myStack.push(node->left); //左
myStack.push(node); //中
myStack.push(nullptr);
} else {
myStack.pop();
node = myStack.top();
myStack.pop();
ans.push_back(node->val);
}
}
return ans;
}
3.后序遍历
vector postorderTraversal(TreeNode* root) { //后序遍历:左右中
vector<int> ans;
if(root == nullptr) return ans;
stack<TreeNode*> myStack;
myStack.push(root);
while(!myStack.empty()) {
TreeNode* node = myStack.top();
if(node != nullptr) { //按照中右左入栈
myStack.pop();
myStack.push(node); //中
myStack.push(nullptr);
if(node->right) myStack.push(node->right); //右
if(node->left) myStack.push(node->left); //左
} else {
myStack.pop();
node = myStack.top();
myStack.pop();
ans.push_back(node->val);
}
}
return ans;
}
三.总结
二叉树的统一迭代写法中,用到了标记的方法,在要处理的节点入栈后加入一个空指针作为标记,那么在遍历栈(先入后出)的过程中如果遇到了空指针,说明下一个元素就是我们要处理的节点,取出加入到结果中即可。
下一篇文章介绍二叉树的层序遍历方式。