数据结构二叉树的操作遍历及树形输出文档格式.docx

上传人:b****3 文档编号:16600858 上传时间:2022-11-24 格式:DOCX 页数:18 大小:18.73KB
下载 相关 举报
数据结构二叉树的操作遍历及树形输出文档格式.docx_第1页
第1页 / 共18页
数据结构二叉树的操作遍历及树形输出文档格式.docx_第2页
第2页 / 共18页
数据结构二叉树的操作遍历及树形输出文档格式.docx_第3页
第3页 / 共18页
数据结构二叉树的操作遍历及树形输出文档格式.docx_第4页
第4页 / 共18页
数据结构二叉树的操作遍历及树形输出文档格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

数据结构二叉树的操作遍历及树形输出文档格式.docx

《数据结构二叉树的操作遍历及树形输出文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构二叉树的操作遍历及树形输出文档格式.docx(18页珍藏版)》请在冰豆网上搜索。

数据结构二叉树的操作遍历及树形输出文档格式.docx

//先序输入二叉树结点的值,空格表示空树

voidcreateBiTree(BiTree&

T)

{

charch;

//输入结点时用

scanf("

%c"

&

ch);

if(ch=='

'

)//若输入空格,该值为空,且没有左右孩子

{

T=NULL;

}else{

T=(BiTNode*)malloc(sizeof(BiTNode));

//分配结点空间

if(!

T)//分配失败

{

exit(OVERFLOW);

}

T->

data=ch;

//生成根结点

createBiTree(T->

lchild);

//构造左子树

rchild);

//构造右子树

}

}

//递归方法先序遍历二叉树

voidpreOrderTraverse(BiTreeT)

if(T)//若非空

if(T->

data)

{//输出

printf("

T->

data);

preOrderTraverse(T->

//递归方法中序遍历二叉树

voidinOrderTraverse(BiTreeT)

//递归方法后序遍历二叉树

voidpostOrderTraverse(BiTreeT)

//层序遍历二叉树

voidLevelTraverse(BiTreeT)

{

queue<

BiTree>

q;

//建队

q.push(T);

//根节点入队

BiTreep;

while(!

q.empty())

p=q.front();

//获得队列的首元素

q.pop();

//首元素出队

cout<

<

p->

data<

"

"

;

//输出结点的值

if(p->

lchild!

=NULL)//若结点的左孩子不空

q.push(p->

rchild!

=NULL)//若结点的右孩子不空

//非递归方法前序遍历二叉树

voidstackPreOrderTraverse(BiTreeT)

stack<

s;

//建栈

s.push(T);

//根结点入栈

//栈首元素

s.empty())

while((p=s.top())&

&

p)

p->

s.push(p->

//左孩子入栈,直到走到尽头

s.pop();

//空指针出栈

p=s.top();

//获得栈顶元素

s.pop();

//出栈

//右孩子入栈

//非递归方法中序遍历二叉树

voidstackInOrderTraverse(BiTreeT)

//入栈

//非递归方法后序遍历二叉树

voidstackPostOrderTraverse(BiTreeT)

//建栈

map<

BiTree,bool>

m;

//标记结点是否已经输出

//栈首元素

if(T)//若不是空树

s.push(T);

//根结点入栈

{

while(true)

{//目的:

找到后序遍历要输出的结点

while((p=s.top())&

lchild&

!

m[p->

lchild])

{//若左孩子未输出,将左孩子入栈,直到尽头,不包括空指针

s.push(p->

}

if((p=s.top())&

rchild&

rchild])

{//若最左孩子的右孩子未输出且非空,则入栈

}else{

break;

//找到结点跳出循环

if((p=s.top())&

m[p])

m[p]=true;

//标记已经输出

//退栈

//后序遍历求二叉树的高度递归算法

intPostTreeDepth(BiTreeT)

inthl,hr,max;

if(T!

=NULL)

hl=PostTreeDepth(T->

//求左子树的深度

hr=PostTreeDepth(T->

//求右子树的深度

max=hl>

hr?

hl:

hr;

//得到左、右子树深度较大者

return(max+1);

//返回树的深度

else

return(0);

//如果是空树,则返回0

/*按竖向树状打印的二叉树代码是为了实现二叉树的横向显示问题。

这种树形要求先打印右子树,再打印根,最后打印左子树,顺序恰为逆中序顺序。

这种输出格式,结点的左右位置与结点的层深有关,

故算法中设置了一个表示当前根节点层深的参数,以控制输出结点的左右位置。

*/

voidPrintTree(BiTreeT,intnLayer)

inti;

if(T==NULL)return;

PrintTree(T->

rchild,nLayer+1);

for(i=0;

i<

nLayer;

i++)

printf("

);

%c\n"

lchild,nLayer+1);

//叶子结点的个数以及元素

intTreeLeaf(BiTreeT)

if(T)

if(!

T->

rchild)

LeafNum++;

cout<

TreeLeaf(T->

returnLeafNum;

intmain()

BiTreeT;

//定义结点

intlayer=0;

//层数

while(true)

输入二叉树结点值空格表示空树:

endl;

createBiTree(T);

递归先序遍历:

preOrderTraverse(T);

递归中序遍历:

inOrderTraverse(T);

递归后序遍历:

postOrderTraverse(T);

层序遍历:

LevelTraverse(T);

非递归先序遍历:

stackPreOrderTraverse(T);

非递归中序遍历:

stackInOrderTraverse(T);

非递归后序遍历:

stackPostOrderTraverse(T);

叶子结点为:

叶子结点个数为:

TreeLeaf(T)<

树的的深度:

layer=PostTreeDepth(T);

layer<

二叉树的树形结构图:

PrintTree(T,layer);

return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1