前言
二叉树的遍历在面试中非常常见,大多数同学都可以写出其递归遍历方式,然而真正有难度的是非递归的遍历方式,自己在面试的时候也遇到过这种情况,下面来分享下自己实现的三种非递归遍历二叉树的源代码~
源代码
首先对树节点进行定义:
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
};
先序遍历:
//树的非递归方式进行先序遍历
vector<int> front_search(TreeNode* root)
{
vector<int> res;
if (root == NULL) return res;
stack<TreeNode*> vec;
TreeNode* node = root;
while (node || !vec.empty())
{
while (node)
{
res.push_back(node->val);
vec.push(node);
node = node->left;
}
if(!vec.empty() || node)
{
node = vec.top();
vec.pop();
node = node->right;
}
}
}
中序遍历:
//树的非递归方式进行中序遍历
vector<int> middle_search(TreeNode* root)
{
vector<int> res;
if (root == NULL) return res;
TreeNode* node = root;
stack<TreeNode*> vec;
while (node || !vec.empty())
{
while (node)
{
vec.push(node);
node = node->left;
}
if (!vec.empty())
{
node = vec.top();
vec.pop();
res.push_back(node->val);
node = node->right;
}
}
}
后序遍历:
//非递归方式进行后序遍历
vector<int> back_search(TreeNode* root)
{
vector<int> res;
if (root == NULL) return res;
TreeNode* node = root, pre_visited = NULL;
stack<TreeNode*> vec;
while (node || !vec.empty())
{
while (node)
{
vec.push(node);
node = node->left;
}
node = vec.top();
if (node->right == NULL || node->right == pre_visited)
{
res.push_back(node->val);
vec.pop();
pre_visited = node;
node == NULL;
}
else
{
node = node->right;
}
}
}