算法设计-二叉树遍历
《数据结构》——算法设计
学号:
姓名:
专业班级:
成绩:
评语:
设计1:二叉树遍历
设计要求:
1.根据二叉树遍历思想,分别实现先序遍历、中序遍历、后序遍历、
层次遍历的算法
2.遍历算法可以尝试使用递归或非递归的方法实现。若需要使用堆
栈或队列,请直接使用C++自带的stack和queue对象。
设计分析
(说明自己实现了哪几个算法,对每个算法的设计思想做简单扼要的说明)
1、先序遍历的递归实现。
2、先序遍历的非递归实现
利用堆栈,先把根结点访问,把左孩子进栈,再右孩子
3、中序遍历的递归实现
4、中序遍历的非递归实现
先走到左孩子的尽头,访问了,再根结点,然后右孩子。
5、后序遍历的递归实现
6、层次遍历
算法1.先序遍历的递归实现
(只需要写出核心代码和运行结果,对代码和结果做分析说明)
//公有函数作为入口
void BiTree::PreOrder()
{
PreOrder(Root);
}
私有函数
int BiTree::PreOrder(BiTreeNode *t)
{
if(t)
{
cout<
if(PreOrder(t->LeftChild)) //遍历左孩子
if(PreOrder(t->RightChild)) //遍历右孩子
return 1;
}
else
return 1; }
先遍历根结点A,再左孩子的B,再左孩子的右孩子的C,最后是右孩子的D。算法2.先序遍历的非递归实现
void BiTree::PreOrder()
{
PreOrder(Root);
}
int BiTree::PreOrder(BiTreeNode *t)
{
stack
stack.push(t);//根结点进栈
while(!stack.empty())
{
BiTreeNode *p=stack.top();
if(p && p->visit==false)//p不为空且未访问过
{
cout<
p->visit=true;//改为已访问
if(p->LeftChild)//如果左孩子不为空,就进栈
stack.push(p->LeftChild);
}
else//其结点和左孩子已访问
{
stack.pop();//根结点退栈
if(p->RightChild)//右孩子不为空
stack.push(p->RightChild);//右孩子进栈}
}
return 0;
}
算法3.中序遍历的递归实现
//公有函数作为入口
void BiTree::InOrder()
{
InOrder(Root);
}
void BiTree::InOrder(BiTreeNode *t)
{
if(t)
{
InOrder(t->LeftChild); //遍历左孩子
InOrder(t->RightChild); //遍历右孩
子
}
}
算法4. 中序遍历的非递归实现
//公有函数作为入口
void BiTree::InOrder()
{
InOrder (Root);
}
//私有函数
void BiTree::InOrder (BiTreeNode *t)
{
stack
stack.push(t);//根结点进栈
while(!stack.empty())
{
BiTreeNode *p=stack.top();
while(p)
{
stack.push(p->LeftChild);//向左走到尽头
p=stack.top();
}
stack.pop();//空子针退栈
if(!stack.empty())
{
p=stack.top();//访问结点
stack.pop();
cout<
stack.push(p->RightChild);//向右走一步}
}
}
算法5.后序遍历的递归实现
//公有函数作为入口
void BiTree::PostOrder()
{
PostOrder(Root);
}
//私有函数
void BiTree::PostOrder(BiTreeNode *t)
{
if(t)
{
PostOrder(t->LeftChild); //先遍历左孩子
PostOrder(t->RightChild); //遍历右孩子
cout<
}
}
算法6.层次遍历
//公有函数作为入口
void BiTree::LevelOrder()
{
LevelOrder(Root);
}
//私有函数
void BiTree::LevelOrder(BiTreeNode *t)
{
queue
BiTreeNode* p=t;
if(p)
{
tq.push(p);
while(!tq.empty())
{
p=tq.front();
tq.pop();
if(p)
{
cout<
tq.push(p->LeftChild); //把其左孩子放入队列 tq.push(p->RightChild); //把其右孩子放入队列 }
}
}
}