c语言如何打印二叉树,打印出二叉树的形状!!!!

Python012

c语言如何打印二叉树,打印出二叉树的形状!!!!,第1张

class node

{

public:

 char ch

 struct node *l,*r

 node(char c,node *lchild,node *rchild):ch(c),l(lchild),r(rchild){}

}

void space(int n)

{

 for(int i=0 i<n i++)

  cout << ' '

}

/* 以 

*右子树

*根

*左子树

*的形式打印

*/

void print(node *T,int n)

{

 if(!T)return

 print(T->r, n+2)

 space(n)

 cout << T->ch << endl

 print(T->l, n+2)

}

int main()

{

 node *T = new node('A',

  new node('B',NULL,NULL),

  new node('C',

   new node('D',NULL,NULL),

   new node('E',NULL,NULL)))

 

 print(T,0)

}

/*建议粘贴到编译器或gvim中看,效果会好很多*/

/*广度优先,很基础的东东*/

/*我的话很罗嗦,忍耐……*/

#include <cstdio>

#define MAX_SIZE 1000

/*注释出错的话就把注释删掉再编译*/

/*********关于二叉树的结构**********/

/**我这里就不用指针来存储了*********/

/**以一个数组的形式来弄*************/

/***********************************/

/****************a[0]***************/

/********a[1]************a[2]*******/

/*****a[3]**a[4]*****a[5]******a[6]*/

/***********************************/

/***也就是说a[i]的儿子是a[i*2+1]****/

/***和a[i*2+2]**********************/

/***********************************/

/***这种结构可能会浪费很多空间******/

/***不过对于这道题我觉得无所谓了吧**/

/***********************************/

/***没有儿子的填-1 或者是其他的*****/

/***有儿子的填数字或字符************/

/***********************************/

/*这是队列*/

int queue[MAX_SIZE]//这是队的存储单位

int head = 0//这是脑袋

int tail = 0//这是尾巴

int main()

{

char tree[MAX_SIZE]//也可以用int神马的,输出的时候用%c就可以了,

char temp, old//temp临时节点,

//...输入就自己写吧…一个while循环,当读到截止符时停止,比如-2,别忘了记录最后一个的位置

//其实这种读入方式直接输出字符串就能得到结果了,但是还是按照广度优先的方法写一下吧

queue[tail++] = 0//把根节点压入队列, 写个标号就可以了

//用log(tree的最后一个儿子的位置) ÷log(2) 等于书的高度H

while(head != tail)//head == tail时就意味着队列空了,等价于queue.IsEmpty()

{

temp = queue[head++]//出队

//...输出temp吧,这个似乎与数据结构木有任何关系,log(temp+1)÷log(2) 得到temp节点在第几层这里设为x, temp - 2 ^ 层数,得到了该层得第几个,设为y

//每个占三个空格位置,左右用来间隔,中间用来写字

//for(i=0i<H-xi++) printf(" ")可能三个可能两个,试试

//for(i=0i<H-yi++) printf(" ")可能三个可能两个,试试

//输出tree[temp]吧

//回车神马时候输……呃……我有时间再看弄吧

//所有儿子入队

if(tree[temp*2+1] != -1 )//如果有儿子

queue[tail++] = temp*2+1//压的是角标不是内容

if(tree[temp*2+2] != -1)

queue[tail++] = temp*2+2//压的是角标不是内容

}

return 0

}

假设输出这棵树:

.....7

..../.\

...5...6

../\.../\

.1..2.3..4

其中.代表空格

首先不论你用什么方法(先根,中根,后根),将树读入一个数组

然后计算各层的结点数,当然也可以在遍历的同时,将各层的结点数用一个数组保存起来

然后用for循环控制输出的层数(注意,将"/","\"所占层数也考虑进去),

然后具体输出各层,至于每个结点,以及"/"和"\"间各空多少空格,

自己多输出几次看看效果,调整就可以了