int main()
{
int i,j,k,n
scanf("%d", &n)
for (i=0i<ni++)
{for (j=0j<=2-ij++)
printf(" ")
for (k=0k<=2*ik++)
printf("*")
printf("\n")
}
return 0
}
数字大点的时候不对 ,在看
http://zhidao.baidu.com/link?url=LpE5M8_jdWMqeYajDS7W4cY-5N8-ZYxxMdBxDUNtFvmk3-EVUvZez1kWxfiLT__DAOmRRqaEV5zO61rBLYw27a#include<stdio.h>
#include<malloc.h>
#define DEGREE 5 //树的高度
#define NULL 0
#define QUEUESIZE 10
#define MAX_NODE_NUM 100
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@树和二叉树的结构体@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
typedef struct st1//树节点的类型
{
char data//数据域,采用char星
struct st1 *children[DEGREE]//指向孩子节点的指针域
}CTreeNode
typedef struct st2
{
char data//数据域
struct st2 *lchild,*rchild//左右孩子节点的指针
}BTreeNode
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@查找树的节点@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
CTreeNode *SearchCTree(CTreeNode *root ,char data)
{
int i
CTreeNode *returnNode
if(root->data==data)
return root
else
{
for(i=0i<DEGREEi++)
{
if(root->children[i]==NULL)
return NULL
else
{
returnNode=SearchCTree(root->children[i],data)//递归查找
if(returnNode!=NULL)
return returnNode
}
}
}
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@生成树@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
CTreeNode *CreateSTree()
{
int i,j,k
char data, parent
CTreeNode *root,*parentNode,*node
printf("请输入树的节点的数量:")
scanf("%d",&j)
fflush(stdin)//清除键盘缓存
if(j==0)
return NULL//空树,结束函数
printf("请输入根节点的数据:")
scanf("%c",&data)
fflush(stdin)
root=(CTreeNode *)malloc(sizeof(CTreeNode))
root->data=data
for(i=0i<DEGREEi++)
root->children[i]=NULL
for(i=2i<=ji++)//依次输入每个节点的信息
{
printf("请输入第%d个节点的数据及其父节点的数据:",i)
scanf("%c%c",&data,&parent)//切记当以%c号格式输入数据时候,不要输入空格
fflush(stdin)
node=(CTreeNode *)malloc(sizeof(CTreeNode))
node->data=data
for(k=0k<DEGREEk++)
node->children[k]=NULL
//printf("验证parent=%c\n",parent)
parentNode=SearchCTree(root,parent)//查找指定数据的节点
for(k=0k<DEGREEk++)
{
if(parentNode->children[k]==NULL)
{
parentNode->children[k]=node
break
}
}
}
return root
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@树的遍历@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
void preorderTree(CTreeNode *ctroot)//遍历每个节点的操作就是输出该节点的data域
{
CTreeNode *ctchild
int i
printf("%c",ctroot->data)//先遍历根节点
for(i=0i<DEGREEi++)//依次先序遍历孩子节点
{
ctchild=ctroot->children[i]
if(ctchild==NULL)
break//孩子节点遍历结束,退出
else
preorderTree(ctchild)//递归先序遍历
}
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@结构体类型@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//树队列结构体类型
typedef struct nodeCTree
{
CTreeNode *CTreeArray[MAX_NODE_NUM]//结构体指针数组,存放节点的地址
//struct nodeCTree *next
int CTreeFront,CTreeRear
}QueueCTree
//二叉树队列结构类型
typedef struct nodeBTree
{
BTreeNode *BTreeArray[MAX_NODE_NUM]//结构体指针数组,存放节点的地址
//struct nodeBTree *next
int BTreeFront,BTreeRear
}QueueBTree
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@初始化队列@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//初始化树队列
void initQueueCTree(QueueCTree *&q)
{
q=(QueueCTree *)malloc(sizeof(QueueCTree))
q->CTreeFront=q->CTreeRear=0
}
//初始化二叉树队列
void initQueueBTree(QueueBTree *&q)
{
q=(QueueBTree *)malloc(sizeof(QueueBTree))
q->BTreeFront=q->BTreeRear=0
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@入队列@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//树队列元素入队
int addQueueCTree(QueueCTree *&q,CTreeNode *ctroot)//
{
if((q->CTreeRear+1)%MAX_NODE_NUM==q->CTreeFront)//队满
return 0
q->CTreeRear=(q->CTreeRear+1)%MAX_NODE_NUM
q->CTreeArray[q->CTreeRear]=ctroot
return 1//入队列
}
//二叉树队列元素入队
int addQueueBTree(QueueBTree *&q,BTreeNode *btroot)
{
if((q->BTreeRear+1)%MAX_NODE_NUM==q->BTreeFront)//队满
return 0
q->BTreeRear=(q->BTreeRear+1)%MAX_NODE_NUM
q->BTreeArray[q->BTreeRear]=btroot
return 1//入队列
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@队列判空@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//树的队列判空
int QueueCTreeEmpty(QueueCTree *q)
{
return(q->CTreeFront==q->CTreeRear)
}
//二叉树队列判空
int QueueBTreeEmpty(QueueBTree *q)
{
return(q->BTreeFront==q->BTreeRear)
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@出队列@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//树队列元素出队
CTreeNode *delQueueCTree(QueueCTree *&q)
{
CTreeNode *ctroot
if(q->CTreeFront==q->CTreeRear)//队空
return NULL//返回空指针
q->CTreeFront=(q->CTreeFront+1)%MAX_NODE_NUM
ctroot=q->CTreeArray[q->CTreeFront]
return ctroot//返回节点
}
//二叉树队列元素出队
BTreeNode *delQueueBTree(QueueBTree *&q)
{
BTreeNode *btroot
if(q->BTreeFront==q->BTreeRear)//队空
return NULL//返回空指针
q->BTreeFront=(q->BTreeFront+1)%MAX_NODE_NUM
btroot=q->BTreeArray[q->BTreeFront]
return btroot//返回节点
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@树转化为二叉树@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
void TreeToBTree(CTreeNode *ctroot,BTreeNode *&btroot)//树转化为二叉树ctroot指向树的根节点,btroot,指向二叉树的跟
{
QueueCTree *VisitedCTreeNodes
QueueBTree *VisitedBTreeNodes//辅助队列
initQueueCTree(VisitedCTreeNodes)
initQueueBTree(VisitedBTreeNodes)//初始化队列
CTreeNode *ctnode
BTreeNode *btnode,*p,*LastSibling
int i
btroot=(BTreeNode *)malloc(sizeof(BTreeNode))//添加开辟内存空间语句
btroot->data=ctroot->data//树的根节点作为二叉树的根节点
btroot->lchild=btroot->rchild=NULL
addQueueCTree(VisitedCTreeNodes,ctroot)//树的跟节点入队
addQueueBTree(VisitedBTreeNodes,btroot)//二叉树的跟节点入队
while(!QueueCTreeEmpty(VisitedCTreeNodes))
{
ctnode=delQueueCTree(VisitedCTreeNodes)//树节点出队
btnode=delQueueBTree(VisitedBTreeNodes)//二叉树节点出队
for(i=0i<DEGREEi++)//访问节点所有的孩子节点
{
if(ctnode->children[i]==NULL)//孩子节点访问完毕
break
p=(BTreeNode *)malloc(sizeof(BTreeNode))//分配二叉树节点
p->data=ctnode->children[i]->data
p->lchild=p->rchild=NULL
if(i==0)
btnode->lchild=p//长子,作为父节点的做孩子
else
LastSibling->rchild=p//作为上一个兄弟节点的右孩子
LastSibling=p
addQueueCTree(VisitedCTreeNodes,ctnode->children[i])//树节点进队列
addQueueBTree(VisitedBTreeNodes,p)//二叉树节点进门队列
}
}
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@二叉树的遍历@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
void Preorder(BTreeNode *T)
{
if(T)
{
printf("%2c",T->data)
Preorder(T->lchild)
Preorder(T->rchild)
}
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@主函数调用@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
int main()
{
CTreeNode *Tree
BTreeNode *BTree
printf("创建一棵树\n")
Tree=CreateSTree()
printf("树的先序遍历结果为:")
preorderTree(Tree)
printf("\n")
TreeToBTree(Tree,BTree)
printf("转换后的二叉树,先序遍历的结果为:")
Preorder(BTree)
printf("\n")
return 0
}
#include<stdio.h>#include<malloc.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define NULL 0
typedef int status
typedef struct bitnode{ /*二叉树的结点*/
char data
struct bitnode *lchild,*rchild
}bitnode,*bitree
bitree t
status createbitree(bitree *t) /*按先序次序输入值建立二叉树*/
{
char ch
scanf("%c",&ch)fflush(stdin)/*清除缓存区里的回车*/
if(ch=='*') *t=NULL/*这里以星号作为结束标志*/
else{
if(!(*t=(bitnode *)malloc(sizeof(bitnode))))exit(OVERFLOW)
(*t)->data=ch
createbitree(&((*t)->lchild))
createbitree(&((*t)->rchild))
}
return OK
}
status visit(char ch) /*对二叉树每个结点元素的访问操作*/
{
printf("%c",ch)
return OK
}/*你这个visit函数好像没什么作用?可以删掉*/
status preordertraverse(bitree t) /*按先序访问二叉树*/
{
if(t)
{
printf("%c",t->data)
if(preordertraverse(t->lchild))
if(preordertraverse(t->rchild))return OK
return ERROR
}else return OK
}
status jh(bitree t)
{
bitree x
x=t->lchild
t->lchild=t->rchild
t->rchild=x
return OK
}
status exchange(bitree t) /*交换二叉树中所有结点的左、右子树*/
{
if(t)
{
jh(t)
if(jh(t->lchild)) /*这里是最重要的地方,你好像写错了吧*/
if(jh(t->rchild))return OK
return ERROR
}else return OK
}
void main()
{
printf("input to create binary tree:\n")
createbitree(&t)/*按先序建立二叉树*/
printf("create ok")/*提示createbitree函数没有出问题*/
exchange(t)/*交换每个结点的左、右子树*/
printf("\n")/*输出一个换行*/
preordertraverse(t)/*按先序访问修改后的二叉树*/
getch()
}
我试过了,可以