㈠ c语言绘制二叉树
你那里是打印出的啥?不会是没有存下数据打印了乱码吧?:)
[修改]
比如,我把和你的二叉树相关的代码去掉,改了一下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <graphics.h>
int main()
{
char str[10];
int x = 100, y = 100;
int e = 9;
/* select a driver and mode that supports */
/* multiple drawing colors. */
int gdriver = DETECT, gmode = VGA, errorcode;
detectgraph(&gdriver, &gmode);
/* initialize graphics and local variables */
initgraph(&gdriver, &gmode, "d:\\bc\\bgi");
/* read result of initialization */
errorcode = graphresult();
if (errorcode != grOk) /* an error occurred */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* terminate with an error code */
}
setcolor(BLACK);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(x,y,9,9);
setcolor(WHITE);
circle(x,y,10);
sprintf(str,"%d",e);
outtextxy(x-3,y-2,str);
/* clean up */
getch();
/* colse */
closegraph();
return 0;
}
就能在圈圈里打印出"9"
㈡ 请问C语言如何创建二叉树
创建二叉树的源程序如下:
#include <cstdlib>
#include <stdio.h>
typedef struct node
{ //树的结点
int data;
struct node* left;
struct node* right;
} Node;
typedef struct
{ //树根
Node* root;
} Tree;
void insert(Tree* tree, int value)//创建树
{
Node* node=(Node*)malloc(sizeof(Node));//创建一个节点
node->data = value;
node->left = NULL;
node->right = NULL;
if (tree->root == NULL)//判断树是不是空树
{
tree->root = node;
}
else
{//不是空树
Node* temp = tree->root;//从树根开始
while (temp != NULL)
{
if (value < temp->data)//小于就进左儿子
{
if (temp->left == NULL)
{
temp->left = node;
return;
}
else
{//继续判断
temp = temp->left;
}
}
else {//否则进右儿子
if (temp->right == NULL)
{
temp->right = node;
return;
}
else {//继续判断
temp = temp->right;
}
}
}
}
return;
}
void inorder(Node* node)//树的中序遍历
{
if (node != NULL)
{
inorder(node->left);
printf("%d ",node->data);
inorder(node->right);
}
}
int main()
{
Tree tree;
tree.root = NULL;//创建一个空树
int n;
scanf("%d",&n);
for (int i = 0; i < n; i++)//输入n个数并创建这个树
{
int temp;
scanf("%d",&temp);
insert(&tree, temp);
}
inorder(tree.root);//中序遍历
getchar();
getchar();
return 0;
}
(2)c语言打印二叉树扩展阅读:
简单二叉树定义范例:此树的顺序结构为:ABCDE
#include <cstdlib>
#include <stdio.h>
#include <string>
int main()
{
node* p = newnode;
node* p = head;
head = p;
string str;
cin >> str;
creat(p, str, 0)//默认根结点在str下标0的位置
return 0;
}
//p为树的根结点(已开辟动态内存),str为二叉树的顺序存储数组ABCD##E或其他顺序存储数组,r当前结点所在顺序存储数组位置
void creat(node* p, string str, int r)
{
p->data = str[r];
if (str[r * 2 + 1] == '#' || r * 2 + 1 > str.size() - 1)p->lch = NULL;
else
{
p->lch = newnode;
creat(p->lch, str, r * 2 + 1);
}
if (str[r * 2 + 2] == '#' || r * 2 + 2 > str.size() - 1)p->rch = NULL;
else
{
p->rch = newnode;
creat(p->rch, str, r * 2 + 2);
}
}
㈢ c语言(二叉树)
看你是不是scanf里面是不是放的地址,内存是不是泄露或者溢出,冲突了
㈣ C语言 二叉树 打印出二叉树 使用构造体 指针
这个类型中出现的不是自己类型的成员,而是自己类型的指针,自然就没有问题
只有后面的问题的原因如下:由于要在Creat函数中修改根指针,因此,需要通过函数参数来修改传递进去的指针形参,如果按传统C的做法,自然只有二重指针才能修改指针,或者用C++ 的办法,用指针的引用(这个引用其实就是别名),你的参数中的*代表指针,那个&代表引用
㈤ 用c语言实现二叉树的程序,可以输入输出和遍历
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
const int MaxLength=10;//结点个数不超过10个
typedef struct tree
{
char data;
struct tree *lchild,*rchild;
}tree;
//先序递归 建立二叉树
void Createbitree(tree* &T)
{
char ch;
ch=getchar();
if(ch=='#')
T=NULL;
else
{
T=(tree*)malloc(sizeof(tree));
T->data =ch;
Createbitree(T->lchild );
Createbitree(T->rchild );
}
}
//先序递归遍历
void PreOrderTraverse(tree* T)
{
if(T)
{
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序递归遍历
void InOrderTraverse(tree* T)
{
if(T)
{
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(tree* T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
}
//层序遍历
void LevelOrderTraverse(tree* T)
{
tree* Q[MaxLength];
int front=0,rear=0;
tree* p;
if(T)//根结点入队
{
Q[rear]=T;
rear=(rear+1)%MaxLength;
}
while(front!=rear)
{
p=Q[front]; //队头元素出队
front=(front+1)%MaxLength;
cout<<p->data;
if(p->lchild)//左孩子不为空,入队
{
Q[rear]=p->lchild;
rear=(rear+1)%MaxLength;
}
if(p->rchild)//右孩子不为空,入队
{
Q[rear]=p->rchild;
rear=(rear+1)%MaxLength;
}
}
}
//主函数
void main()
{
cout<<"请按先序次序输入二叉树的数据:"<<endl;
tree* T;
Createbitree(T);
cout<<"二叉树的先序序列为:"<<endl;
PreOrderTraverse(T);
cout<<endl<<"二叉树的中序序列为:"<<endl;
InOrderTraverse(T);
cout<<endl<<"二叉树的后序序列为:"<<endl;
PostOrderTraverse(T);
cout<<endl<<"二叉树的层序序列为:"<<endl;
LevelOrderTraverse(T);
cout<<endl;
}
比如 1
2 3
4 5 6 7
按先序输入是124##5##36##7##
㈥ c语言广义表形式输入二叉树,从下到上按层打印改树; 不知道哪错了,请各位大侠帮帮忙!
太长了 懒得看 给你看我的把
#include "stdio.h"
#include "malloc.h"
#define MaxSize 20
typedef struct tnode
{
int data;
struct tnode *lchild,*rchild;
}BTNode;
//建立二叉树运算算法
void CreatBTree(BTNode *&bt,char *str)
{
BTNode *St[MaxSize],*p=NULL;
int top=-1,k,j=0;
char ch;
bt=NULL; //建立的二叉树初始化时为空
ch=str[0];
while(ch!='\0')
{
switch(ch)
{
case '(': top++;St[top]=p;k=1;break; //为左孩子结点
case ')': top--;break;
case ',': k=2;break; //为右孩子结点
default : p=(BTNode *)malloc(sizeof(BTNode));
p->data =ch;p->lchild =p->rchild =NULL;
if(bt==NULL) //p为二叉树的根结点
bt=p;
else //已建立二叉树根结点
{
switch(k)
{
case 1: St[top]->lchild =p;break;
case 2: St[top]->rchild =p;break;
}
}
}
j++;ch=str[j];
}
}
//求二叉树高度运算算法(递归法)
int BTHeight(BTNode *bt)
{
int lchilddep,rchilddep;
if(bt==NULL) //空树高度为0
return 0;
else
{
lchilddep=BTHeight(bt->lchild);//求左子树的高度
rchilddep=BTHeight(bt->rchild);//求右子树的高度
return (lchilddep>rchilddep)?(lchilddep+1):(rchilddep+1);
}
}
//求二叉树结点个数运算算法(递归法)
int NodeCount(BTNode *bt)
{
int num1,num2;
if(bt==NULL) //空树结点个数为0
return 0;
else
{
num1=NodeCount(bt->lchild ); //求出左子树的结点树
num2=NodeCount(bt->rchild ); //求出右子树的结点树
return (num1+num2+1);
}
}
//求二叉树叶子结点个数运算算法(递归法)
int LeafCount(BTNode *bt)
{
int num1,num2;
if(bt==NULL)
return 0; //空树叶子结点个数为0
else if(bt->lchild ==NULL&&bt->rchild ==NULL)
return 1; //若为叶子结点返回1
else
{
num1=LeafCount(bt->lchild ); //求出左子树的叶子结点树
num2=LeafCount(bt->rchild ); //求出右子树的叶子结点树
return num1+num2;
}
}
//以括号表示法输出二叉树运算算法(递归法)
void DispBTree(BTNode *bt)
{
if(bt!=NULL)
{
printf("%c",bt->data);
if(bt->lchild !=NULL || bt->rchild!=NULL)
{
printf("(");
DispBTree(bt->lchild ); //以递归法处理左子树
if(bt->rchild !=NULL)
printf(",");
DispBTree(bt->rchild ); //以递归法处理右子树
printf(")");
}
}
}
//先序遍历
void PreOrder(BTNode *bt)
{
if(bt!=NULL)
{
printf("%c",bt->data );
PreOrder(bt->lchild );
PreOrder(bt->rchild );
}
}
//中序遍历
void InOrder(BTNode *bt)
{
if(bt!=NULL)
{
InOrder(bt->lchild );
printf("%c",bt->data );
InOrder(bt->rchild );
}
}
//后序遍历
void PostOrder(BTNode *bt)
{
if(bt!=NULL)
{
PostOrder(bt->lchild );
PostOrder(bt->rchild );
printf("%c",bt->data );
}
}
int main() //主函数
{
BTNode *bt;
CreatBTree(bt,"A(B(D,E(G,H),C(,F(I)))");
printf("二叉数bt以括号法显示为: "); DispBTree(bt);printf("\n");
printf("先序发遍历二叉数bt为: "); PreOrder(bt); printf("\n");
printf("中序发遍历二叉数bt为: "); InOrder(bt); printf("\n");
printf("后序发遍历二叉数bt为: "); PostOrder(bt); printf("\n");
printf("二叉数bt的高度为: %d\n", BTHeight(bt));
printf("二叉数bt的结点数为: %d\n", NodeCount(bt));
printf("二叉数bt的叶子结点数为: %d\n", LeafCount(bt));
printf("\n");
return 0;
}
㈦ c语言数组实现二叉树的问题,怎么把二叉树按顺序打印出来。
#include<stdio.h> #include<stdlib.h> struct BiTNode *stack[100]; struct BiTNode//定义结构体 { char data; struct BiTNode *lchild,*rchild; }; void later(struct BiTNode *&p) //前序创建树 { char ch; scanf("%c",&ch); if(ch==' ') p=NULL; else { p=(struct BiTNode *)malloc(sizeof(struct BiTNode)); p->data=ch; later(p->lchild); later(p->rchild); } } void print(struct BiTNode *p) //前序遍历(输出二叉树) { int i=-1; while(1) { while(p!=NULL) { stack[++i]=p->rchild;/*printf("ok?\n");*/ printf("%c",p->data); p=p->lchild; } if(i!=-1) { p=stack[i]; i--; } else return; } } void main()//主函数 { struct BiTNode *p,*t; later(p); print(p); }
㈧ 数据结构 用C语言编写 打印二叉树 的实验 (完整的程序) 要求如下:
/*建议粘贴到编译器或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=0; i<H-x; i++) printf(" ");可能三个可能两个,试试;
//for(i=0; i<H-y; i++) 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;
}
㈨ 二叉树的建立与遍历(C语言)
楼主你好~~~“ф”字符的源代码我忘记了,我这里有一个自己写过的遍历算法
#include<iostream.h>
typedef struct btnode
{
char data;
struct btnode *Lchild,*Rchild;
}*bitreptr;
void Create(bitreptr &p)
{
char n;
p=new btnode;
cin>>n;
if(n!='#')
{
p->data=n;
Create(p->Lchild);
Create(p->Rchild);
}
else
p=NULL;
}
void preorder(bitreptr &p)
{
if(p)
{
cout<<p->data<<" ";
preorder(p->Lchild);
preorder(p->Rchild);
}
}
void midorder(bitreptr &p)
{
if(p)
{
midorder(p->Lchild);
cout<<p->data<<" ";
midorder(p->Rchild);
}
}
void postorder(bitreptr &p)
{
if(p)
{
postorder(p->Lchild);
postorder(p->Rchild);
cout<<p->data<<" ";
}
}
void change(bitreptr &p)
{
bitreptr t,q;
if(p)
{
t=p->Lchild;
q=p->Rchild;
p->Lchild=q;
p->Rchild=t;
change(p->Lchild);
change(p->Rchild);
}
}
void main()
{
char i;
cout<<"请选择所需功能('A'输出该二叉树序列,'B'输出交换后二叉树序列)"<<endl;
cin>>i;
bitreptr p;
cout<<"输入数据:";
Create(p);
switch(i)
{
case 'A':
{
cout<<"前序:";
preorder(p);
cout<<endl;
cout<<"中序:";
midorder(p);
cout<<endl;
cout<<"后序:";
postorder(p);
cout<<endl;
}break;
case 'B':
{
change(p);
cout<<"交换二叉树前序:";
preorder(p);
cout<<endl;
cout<<"交换二叉树中序:";
midorder(p);
cout<<endl;
cout<<"交换二叉树后序:";
postorder(p);
cout<<endl;
}break;
}
}
这个算法输入时要以“#”代表空节点,及将[测试数据] “ABCффDEфGффFффф”改成“ABC##DE#G##F###”即可。另外我的算法包括了二叉树左右子树交换的代码“change(bitreptr &p)”,只要楼主稍作修改就可以得到你想要的完美结果~
㈩ c语言如何打印二叉树,打印出二叉树的形状!!!!
classnode
{
public:
charch;
structnode*l,*r;
node(charc,node*lchild,node*rchild):ch(c),l(lchild),r(rchild){}
};
voidspace(intn)
{
for(inti=0;i<n;i++)
cout<<'';
}
/*以
*右子树
*根
*左子树
*的形式打印
*/
voidprint(node*T,intn)
{
if(!T)return;
print(T->r,n+2);
space(n);
cout<<T->ch<<endl;
print(T->l,n+2);
}
intmain()
{
node*T=newnode('A',
newnode('B',NULL,NULL),
newnode('C',
newnode('D',NULL,NULL),
newnode('E',NULL,NULL)));
print(T,0);
}