二叉树遍历的三种非递归实现方式
二叉树的前序遍历,中序遍历,后续遍历是三种十分基础的便利方式,大多数人对其三种递归方式的遍历比较熟悉。这篇文章主要针对LeetCode上面的题目,分别对该三种遍历的非递归遍历方式进行了仿真,主要用到的数据结构是栈。
初学者对三种序列的顺序容易搞混淆,这里首先提供一种简单的记忆方式。一颗二叉树简单分为根节点,左节点,右节点。按照根节点在遍历中的顺序,例如,前序,那么就是根节点在前面,可以很好的记忆三种遍历方式。
后续遍历
非递归实现
Leecode145题:点击打开链接
vector<int> postorderTraversal(TreeNode* root) {
vector<int>res;
stack<TreeNode*>toVisit;
TreeNode* pCurrent=root;
TreeNode* pLastNode=nullptr;
while(pCurrent||!toVisit.empty()){
if(pCurrent){
toVisit.push(pCurrent);
pCurrent=pCurrent->left;
}
else{
TreeNode* pTop=toVisit.top();
if(pTop->right&&pLastNode!=pTop->right){
pCurrent=pTop->right;
}
else{
res.push_back(pTop->val);
pLastNode=pTop;
toVisit.pop();
}
}
}
return res;
}
中序遍历
非递归实现
Leecode94题:点击打开链接
vector<int> inorderTraversal(TreeNode* root)
vector<int> res;
stack<TreeNode*> toVisit;
TreeNode* pCurrent = root;
while (pCurrent || !toVisit.empty()) {
if (pCurrent) {
toVisit.push(pCurrent);
pCurrent = pCurrent -> left;
}
else {
pCurrent = toVisit.top();
toVisit.pop();
res.push_back(pCurrent -> val);
pCurrent = pCurrent -> right;
}
}
return res;
}
前序遍历
非递归实现
Leecode144题:点击打开链接
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode *>toVisit;
vector<int>res;
if(root==nullptr){
return res;
}
TreeNode *pCurrent=nullptr;
toVisit.push(root);
while(!toVisit.empty()){
pCurrent=toVisit.top();
res.push_back(pCurrent->val);
toVisit.pop();
if(pCurrent->right){
toVisit.push(pCurrent->right);
}
if(pCurrent->left){
toVisit.push(pCurrent->left);
}
}
return res;
}