您的位置:首页 > 其它

二叉树前序、中序、后序遍历

2016-04-11 11:20 204 查看
二叉树节点结构

struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};


递归版本比较简单,不再叙述,这里讲一下递归版本

先把代码贴出来

void preOrder(TreeNode* root, vector<int>& vec)  // 前序遍历
{
stack<TreeNode*> s;
while (!s.empty() || root != NULL)
{
while (root != NULL)
{
s.push(root);
vec.push_back(root->val);
root = root->left;
}
if (!s.empty())
{
root = s.top();
s.pop();
root = root->right;
}
}

}
void inOrder(TreeNode* root, vector<int>& vec)  // 中序遍历
{
stack<TreeNode*> s;
while (!s.empty() || !root)
{
while (root != NULL)
{
s.push(root);
root = root->left;
}
if (!s.empty())
{
root = s.top();
s.pop();
vec.push_back(root->val);
root = root->right;
}
}
}

void postOrder(TreeNode* root, vector<int>& vec)  // 后序遍历
{
stack<TreeNode*> s;
TreeNode* pre = NULL;

while (!s.empty() || !root)
{
while (root != NULL)
{
s.push(root);
root = root->left;
}
if (!s.empty())
{
root = s.top();
if (root->right != NULL && root->right != pre)
{
root = root->right;
}
else
{
vec.push_back(root->val);
pre = root;
root = NULL;
s.pop();
}
}
}
}


前序遍历

前序遍历的过程为中,左,右。即先父结点,再左结点,再右结点。

如图1所示,二叉树的前序遍历结果为ABDGCEF。



前序遍历代码中使用栈S,保存走过的结点。从根节点出发,沿着左孩子走到底。接着弹出栈顶元素,把该结点右孩子赋给当前结点。知道当前结点为空且栈空,结束遍历。

中序遍历

中序遍历的代码跟前序遍历差不多,只是在存结点值时,是在弹栈时存,而不是在沿着左孩子遍历的时候存。图1的中序遍历结果为DGBAECF。

后序遍历

后序遍历是这三个遍历中最复杂的一个。需要一个结点来记录上一次打印过的结点。仍然是从根节点出发沿左孩子走到底。然后判断该结点是否有右孩子,该结点右孩子是否刚刚已经遍历过。如果已经遍历过,则打印当前结点,令记录结点为当前结点,令当前结点为空(因为下一个结点在栈顶)。如果没有遍历过,则令当前结点为当前结点的右孩子。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 遍历