数据结构二叉树操作遍历树形输出Word下载.docx
《数据结构二叉树操作遍历树形输出Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构二叉树操作遍历树形输出Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
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())&
{//若最左孩子的右孩子未输出且非空,则入栈