二叉树三种遍历的非递归实现
Posted TangguTae
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树三种遍历的非递归实现相关的知识,希望对你有一定的参考价值。
二叉树的三种遍历前、中、后采用递归的方式实现起来会很简单,非递归值得一做。
递归的实现见:二叉树需要掌握的基本知识_TangguTae的博客-CSDN博客
前序遍历
非递归去实现遍历其思想就是去模拟递归的逻辑,要借助额外的数据结构去实现非递归。
vector<int> preorderTraversal(TreeNode* root)
//非递归实现二叉树的前序遍历
if (root == nullptr)
return ;
vector<int> res;
stack<TreeNode*> st;//借助栈来实现
TreeNode* cur = root;
while (cur || !st.empty())
while (cur != nullptr)//先一直找左
res.push_back(cur->val);//把根节点的值push进去
st.push(cur);
cur = cur->left;
cur = st.top();
st.pop();
cur = cur->right;//然后找右
return res;
中序遍历
思路和前序遍历相同
vector<int> inorderTraversal(TreeNode* root)
//非递归实现中序遍历
//本质上是模拟递归的逻辑
if (root == nullptr)
return ;
stack<TreeNode*> st;
TreeNode* cur = root;
vector<int> res;
while (cur || !st.empty())
while (cur != nullptr)
st.push(cur);
cur = cur->left;
cur = st.top();
st.pop();
res.push_back(cur->val);//遍历完左之后再push根节点
cur = cur->right;
return res;
后序遍历
后序遍历的过程稍微麻烦一点,因为是最后遍历根,所以需要判断根节点是否是第一次访问,如果是说明还需要遍历他的右孩子,如果不是说明左孩子和右孩子都已经遍历过了。
vector<int> postorderTraversal(TreeNode* root)
if (root == nullptr)
return ;
stack<pair<TreeNode*, bool>> st;//额外增加一个bool标志位
TreeNode* cur = root;
vector<int> res;
while (cur || !st.empty())
while (cur != nullptr)//前面的逻辑还是一样
st.push( cur,false );
cur = cur->left;
pair<TreeNode*, bool>& p = st.top();
if (p.second == false)//如果是第一次遍历,继续查看右孩子
p.second = true;
cur = p.first->right;
else//不是第一次遍历则直接把根节点push进去
res.push_back(p.first->val);
st.pop();
return res;
以上是关于二叉树三种遍历的非递归实现的主要内容,如果未能解决你的问题,请参考以下文章