算法设计-二叉树遍历

《数据结构》——算法设计

学号:

姓名:

专业班级:

成绩:

评语:

设计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<data; //遍历根结点

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;

stack.push(t);//根结点进栈

while(!stack.empty())

{

BiTreeNode *p=stack.top();

if(p && p->visit==false)//p不为空且未访问过

{

cout<data;//访问结点

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;

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<data;

stack.push(p->RightChild);//向右走一步}

}

}

算法5.后序遍历的递归实现

//公有函数作为入口

void BiTree::PostOrder()

{

PostOrder(Root);

}

//私有函数

void BiTree::PostOrder(BiTreeNode *t)

{

if(t)

{

PostOrder(t->LeftChild); //先遍历左孩子

PostOrder(t->RightChild); //遍历右孩子

cout<data; //遍历根结点

}

}

算法6.层次遍历

//公有函数作为入口

void BiTree::LevelOrder()

{

LevelOrder(Root);

}

//私有函数

void BiTree::LevelOrder(BiTreeNode *t)

{

queue tq;

BiTreeNode* p=t;

if(p)

{

tq.push(p);

while(!tq.empty())

{

p=tq.front();

tq.pop();

if(p)

{

cout<data;

tq.push(p->LeftChild); //把其左孩子放入队列 tq.push(p->RightChild); //把其右孩子放入队列 }

}

}

}

相关主题
相关文档
最新文档