才发现,慢慢地长大,烦恼也慢慢地来了。时间,带给我们的,是成熟 and 沧桑、、
今天来讲一讲二叉树的遍历,主要通过递归和非递归的方式来实现、、
遍历方式:
先序:根 - 左 - 右
中序:左 - 根 - 右
后序:左 - 右 - 根
递归实现
// 先序遍历
void PreOrder(BTNode * b)
{
if(b != NULL)
{
printf("%c\n", b -> data);
PreOrder(b -> lchild);
PreOrder(b -> rchild);
}
}
// 中序遍历
void InOrder(BTNode * b)
{
if(b != NULL)
{
InOrder(b -> lchild);
printf("%c\n", b -> data);
InOrder(b -> rchild);
}
}
// 后续遍历
void PostOrder(BTNode * b)
{
if(b != NULL)
{
PostOrder(b -> lchild);
PostOrder(b -> rchild);
printf("%c\n", b -> data);
}
}
非递归实现:
后序好像是最麻烦的诶, 我还是下次再补上吧、、、 (下面的代码参考了 cnblog 海子的 博客)
// 先序遍历
void PreOrder(BTNode *b)
{
stack<BTNode*> sta;
BTNode *p = b;
while(p != NULL || !sta.empty())
{
while(p != NULL)
{
printf("%c\n", p -> data);
sta.push(p);
p = p -> lchild;
}
if(! sta.empty())
{
p = sta.top();
sta.pop();
p = p -> rchild;
}
}
}
// 中序遍历
void InOrder(BTNode *b)
{
stack<BTNode*> sta;
BTNode *p = b;
while(p != NULL || sta.empty())
{
while(p != NULL)
{
sta.push(p);
p = p -> lchild;
}
if(!sta.empty())
{
p = sta.top();
printf("%c", p -> data);
sta.pop();
p = p -> rchild;
}
}
}
例题:
HDU 1710 链接: http://acm.hdu.edu.cn/showproblem.php?pid=1710
题意是,给你一棵二叉树的 先序遍历的排列和中序遍历排列,然后你求出后序遍历的排列。