㈠ 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);
}