数据结构二叉树操作遍历树形输出Word下载.docx

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

数据结构二叉树操作遍历树形输出Word下载.docx

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

数据结构二叉树操作遍历树形输出Word下载.docx

structBiTNode*lchild,*rchild;

//左右孩子

}BiTNode,*BiTree;

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

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)

printf("

p->

s.push(p->

//左孩子入栈,直到走到终点

s.pop();

//空指针出栈

p=s.top();

//获取栈顶元素

//出栈

//右孩子入栈

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

voidstackInOrderTraverse(BiTreeT)

//建栈

//入栈

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

voidstackPostOrderTraverse(BiTreeT)

map<

BiTree,bool>

m;

//标志结点能否已经输出

//栈首元素

if(T)//若不是空树

//根结点入栈

while(true)

{//目的:

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

lchild&

!

m[p->

lchild])

{//若左孩子未输出,将左孩子入栈,直到终点,不包含空指针s.push(p->

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

rchild&

rchild])

{//若最左孩子的右孩子未输出且非空,则入栈s.push(p->

break;

//找到结点跳出循环

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++)

);

%c\n"

lchild,nLayer+1);

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

intTreeLeaf(BiTreeT)

if(T)

rchild)

LeafNum++;

TreeLeaf(T->

returnLeafNum;

intmain()

BiTreeT;

//定义结点

intlayer=0;

//层数

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

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;

BiTreep;

//标志结点能否已经输出

//若不是空树

找到后序遍历要输出的结点while((p=s.top())&

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

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

当前位置:首页 > 解决方案 > 工作计划

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

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