二叉树前序、中序、后序遍历(非递归统一解法)
前言
最近复习了二叉树的前序遍历、中序遍历和后序遍历,找到了一种统一的非递归的迭代方法。
思路
思路本质上还是递归,只不过不通过递归函数显式递归,而是通过栈模拟递归。
该思路仅需要微小改动就可以通用于二叉树的先/中/后序遍历,也很容易理解。
注意:
- 该思路的核心是将
nullptr
作为可以遍历栈中下1个结点的标志(因此也就不能将空结点压入栈中),即栈中弹出nullptr
时就可以遍历下1个栈顶结点,如果不是nullptr
则根据遍历顺序入栈,当前根结点入栈时也要将nullptr
压入栈中(后续遇到这个nullptr
时就可以遍历到该根结点)。 - 遍历顺序和入栈顺序相反
前序遍历
LeetCode题解:https://www.cnblogs.com/chouxianyu/p/13290758.html
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> nodes;
if (root!=nullptr)
nodes.push(root);
while(!nodes.empty()){
root = nodes.top();
nodes.pop();
if (root==nullptr){
result.push_back(nodes.top()->val);
nodes.pop();
}else{
if (root->right!=nullptr)
nodes.push(root->right);
if (root->left!=nullptr)
nodes.push(root->left);
nodes.push(root);
nodes.push(nullptr);
}
}
return result;
}
中序遍历
LeetCode题解:https://www.cnblogs.com/chouxianyu/p/13293153.html
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> nodes;
if(root!=nullptr)
nodes.push(root);
while(!nodes.empty()){
root=nodes.top();
nodes.pop();
if(root==nullptr){
result.push_back(nodes.top()->val);
nodes.pop();
}else{
if (root->right!=nullptr)
nodes.push(root->right);
nodes.push(root);
nodes.push(nullptr);
if (root->left!=nullptr)
nodes.push(root->left);
}
}
return result;
}
后序遍历
LeetCode题解:https://www.cnblogs.com/chouxianyu/p/13293152.html
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> nodes;
vector<int> result;
if (root!=nullptr)
nodes.push(root);
while(!nodes.empty()){
root=nodes.top();
nodes.pop();
if(root==nullptr){
result.push_back(nodes.top()->val);
nodes.pop();
}else{
nodes.push(root);
nodes.push(nullptr);
if(root->right!=nullptr)
nodes.push(root->right);
if(root->left!=nullptr)
nodes.push(root->left);
}
}
return result;
}
参考链接
作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!