二叉树的非递归遍历
二叉树是一种基础数据结构,有很多复杂的数据结构是在其基础上设计的。二叉树基本的操作包括先序、中序、后序三种遍历。本文用C++介绍这三种常见遍历方式的非递归实现和二叉树的层次遍历。
二叉树的结构:
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
一、先序遍历
vector<int> preOrder(TreeNode *root)
{
vector<int> v;
stack<TreeNode *> s;
s.push(root);
while (!s.empty())
{
TreeNode *p = s.top();
s.pop();
if (p != 0)
{
v.push_back(p->val);
s.push(p->right);
s.push(p->left);
}
}
return v;
}
二、中序遍历
vector<int> preOrder(TreeNode *root)
{
vector<int> v;
stack<TreeNode *> s;
s.push(root);
while (true)
{
while (s.top() != 0)
{
s.push(s.top()->left);
}
s.pop();
if (s.empty())
{
break;
}
TreeNode *p = s.top();
s.pop();
v.push_back(p->val);
s.push(p->right);
}
return v;
}
三、后序遍历
vector<int> preOrder(TreeNode *root)
{
vector<int> v;
if (root == 0)
{
return v;
}
stack<TreeNode *> s;
TreeNode *p = root;
do {
while (p != 0)
{
s.push(p);
p = p->left;
}
TreeNode *right = 0;
while (!s.empty())
{
p = s.top();
if (p->right == right)
{
s.pop();
v.push_back(p->val);
right = p;
}
else
{
p = p->right;
break;
}
}
} while (!s.empty());
return v;
}
四、层次遍历
vector<vector<int>> levelOrder(TreeNode* root)
{
vector<vector<int>> vs;
if (root == 0) return vs;
queue<TreeNode *> q;
q.push(root);
q.push(0);
vs.push_back(vector<int>());
while (!q.empty())
{
TreeNode *p = q.front();
q.pop();
if (p != 0)
{
vs.back().push_back(p->val);
if (p->left != 0) q.push(p->left);
if (p->right != 0) q.push(p->right);
}
else
{
if (q.empty()) break;
vs.push_back(vector<int>());
q.push(0);
}
}
return vs;
}