郝斌数据结构(五):树

先学习递归:汉诺塔问题

# include <stdio.h>


void hannuota( int n, char A, char B, char C )//A上n个盘子借助B移到C
{
/*
如果是1个盘子
直接将A柱子上的盘子从A移动到C
否则
先将A柱子上的n-1个盘子借助于C移动到B
直接将A柱子上的盘子从A移到C
最后将B柱子上的n-1借助A移动到C
*/

if( 1 == n )
{
printf( "将编号为%d的盘子直接从%c柱子%c柱子\n", n, A, C );
}
else
{
hannuota( n-1, A, C, B );
printf( "将编号为%d的盘子直接从%c柱子%c柱子\n", n, A, C );
hannuota( n-1, B, A, C );

}
}


int main( void )
{
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
int n;

printf( "请输入要移动的盘子个数:" );
scanf( "%d", &n );

hannuota( n, 'A', 'B', 'C' );
}



链式二叉树具体程序:

# include <stdio.h>
# include <malloc.h>


struct BTNode
{
int data;
struct BTNode *pLchild;//p是指针 L是左 child是孩子
struct BTNode *pRchild;
};


void PreTraverseBTree( struct BTNode * pT );
void InTraverseBTree( struct BTNode * pT );
void PostTraverseBTree( struct BTNode * pT );
struct BTNode *CreateBTree( void );


int main( void )
{
struct BTNode *pT = CreateBTree();

printf( "先序\n" );
PreTraverseBTree( pT );//先序


printf( "中序\n" );
InTraverseBTree( pT );//中序


printf( "后序\n" );
PostTraverseBTree( pT );//后序



return 0;
}


void PreTraverseBTree( struct BTNode * pT )
{
/*
伪算法
先访问根节点
再先序访问左子树
再先序访问右子树
*/
if( pT != NULL )
{
printf( "%c\n", pT->data );

if( NULL != pT->pLchild )
{
PreTraverseBTree( pT->pLchild );
}

if( NULL != pT->pRchild )
{
PreTraverseBTree( pT->pRchild );
//pT->pLchild可以代表整个左子树
}


}



}






void InTraverseBTree( struct BTNode * pT )
{


if( pT != NULL )
{


if( NULL != pT->pLchild )
{
InTraverseBTree( pT->pLchild );
}


printf( "%c\n", pT->data );

if( NULL != pT->pRchild )
{
InTraverseBTree( pT->pRchild );
//pT->pLchild可以代表整个左子树
}


}


}




void PostTraverseBTree( struct BTNode * pT )
{


if( pT != NULL )
{


if( NULL != pT->pLchild )
{
InTraverseBTree( pT->pLchild );
}



if( NULL != pT->pRchild )
{
InTraverseBTree( pT->pRchild );
//pT->pLchild可以代表整个左子树
}


printf( "%c\n", pT->data );


}



}


struct BTNode *CreateBTree( void )
{
struct BTNode *pA = ( struct BTNode * )malloc( sizeof( struct BTNode ) );
struct BTNode *pB = ( struct BTNode * )malloc( sizeof( struct BTNode ) );
struct BTNode *pC = ( struct BTNode * )malloc( sizeof( struct BTNode ) );
struct BTNode *pD = ( struct BTNode * )malloc( sizeof( struct BTNode ) );
struct BTNode *pE = ( struct BTNode * )malloc( sizeof( struct BTNode ) );

pA->data = 'A';
pB->data = 'B';
pC->data = 'C';
pD->data = 'D';
pE->data = 'E';

pA->pLchild = pB;
pA->pRchild = pC;

pB->pLchild = pB->pRchild = NULL;

pC->pLchild = pD;
pC->pRchild = NULL;

pD->pLchild = NULL;
pD->pRchild = pE;

pE->pLchild = pE->pRchild = NULL;

return pA;


}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值