⑴ 求c語言數據結構二叉樹的建樹,前序遍歷,輸出樹的代碼,能用採納。
#include
#include
#define MAXSIZE 100 //二叉樹中最多的結點數
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//定義函數指針
typedef void(* Visit)(BiTree);
//二叉樹的初始化
void Init_BiTree(BiTree *T)
{
*T = NULL;
}
//判斷二叉樹是否為空,返回1
int IsEmpty_BiTree(BiTree *T)
{
return *T == NULL;
}
//創建二叉樹
void Create_BiTree(BiTree *T)
{
char ch;
ch = getchar();
//當輸入的是"#"時,認為該子樹為空
if(ch == '#')
*T = NULL;
//創建樹結點
else{
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = ch; //生成樹結點
//生成左子樹
Create_BiTree(&(*T)->lchild);
//生成右子樹
Create_BiTree(&(*T)->rchild);
}
}
//輸出結點的值
void Print_BiTreeNode(BiTree T)
{
printf("%c\t",T->data);
}
//先序遍歷二叉樹
void PreOrder_BiTree(BiTree T,Visit visit)
{
if(!IsEmpty_BiTree(&T))
{
visit(T);
PreOrder_BiTree(T->lchild,visit);
PreOrder_BiTree(T->rchild,visit);
}
}
int main(){
BiTree T;
//將二叉樹初始為一個空的二叉樹
Init_BiTree(&T);
//創建二叉樹
Create_BiTree(&T);
//先序遍歷
printf("\n先序遍歷結果:");
PreOrder_BiTree(T,Print_BiTreeNode);
return 0;
}
⑵ 數據結構關於樹的問題題,求C語言代碼
#include<iostream>
usingnamespacestd;
structTreel{
inta;
Treel*lp,*rp;
};
intCreatTreel(Treel**h,intn){
(*h)=(Treel*)malloc(sizeof(Treel));
cin>>(*h)->a;
if(n==1){
(*h)->lp=NULL;
(*h)->rp=NULL;
return1;
}
CreatTreel(&((*h)->lp),n-1);
CreatTreel(&((*h)->rp),n-1);
}
intTrvalTreel(Treel*h){
if(h->lp==NULL){
cout<<h->a;
return1;
}
if(h->rp==NULL){
cout<<h->a;
return1;
}
TrvalTreel(h->lp);
TrvalTreel(h->rp);
}
voidmain(){
Treel*head=(Treel*)malloc(sizeof(Treel));
intn=3;
CreatTreel(&head,n);
TrvalTreel(head);
}
⑶ C語言,輸入一個數字n,再輸入n個小寫字母,將這個n個小寫字母從小到大輸出。順便我的代碼問題在哪,謝謝
第一題:count 統計數字
輸入一個數n(n<=200000)和n個自然數(每個數都不超過1.5*10^9),請統計出這些自然數各自出現的次數,按順序從小到大輸出。輸入數據保證不相同的數不超過10000個。
樣例輸入:
8
2
4
2
4
5
100
2
100
樣例輸出:
2 3
4 2
5 1
100 2
第二題:expand 字元串的展開
我們可以用減號對連續字母或數字進行縮寫,於是字元串a-dha3-68就可以展開為abcdha34568。
輸入三個參數p1,p2,p3,再輸入一個僅由數字、小寫字母和減號組成的字元串(長度不超過100),請按參數展開此字元串
各個參數的意義如下:
參數p1=1 -> 所有填充的字母都寫成小寫;
參數p1=2 -> 所有填充的字母都寫成大寫;
參數p1=3 -> 所有填充的字母和數字都用星號代替;
參數p2=k -> 同一個填充字元連續寫k遍;
參數p3=1 -> 順序填充;
參數p3=2 -> 逆序填充。
另外,如果減號兩邊的字元一個是數字一個是字母,或者減號右邊的ASCII碼沒左邊的大,則該處不變
樣例輸入1:
1 2 1
abcs-w1234-9s-4zz
樣例輸出1:
abcsttuuvvw1234556677889s-4zz
樣例輸入2:
2 3 2
a-d-d
樣例輸出2:
aCCCBBBd-d
樣例輸入3:
3 4 2
di-jkstra2-6
樣例輸出3:
dijkstra2************6
第三題:game 矩陣取數游戲
一個n行m列的矩陣,每次你需要按要求取出n個數,m次正好將所有數取完。每取出一個數你都會有一個得分,請求出最終的得分最大是多少。
每一次取數的要求:每一行中恰好取一個數,且只能取剩下的數中最左邊或最右邊位置上的數
每取一個數的得分:所取數的數值乘以2^i,i表示這是第i輪取數。
矩陣中的數為不超過100的自然數,1<=n,m<=80
樣例輸入:
2 3
1 2 3
3 4 2
樣例輸出:
82
樣例說明:
1*2+2*2 + 2*4+3*4 + 3*8+4*8 = 82
第四題:core 樹網的核
樹上的任兩點間都有唯一路徑。定義某一點到樹上某一路徑的距離為該點到路徑上所有點的路徑長度中的最小值。定義樹中某條路徑的「偏心距」為所有其它點到此路徑的距離的最大值。定義樹的直徑為樹的最長路徑(可能不唯一)。給出一個有n個節點的無根樹,請找出某個直徑上的一段長度不超過s的路徑(可能退化為一個點),使它的偏心距最小。請輸出這個最小偏心距的值。
題目已經告訴你如下定理:樹的所有直徑的中點必然重合(這個中點可能在某條邊上)。其實這個結論很顯然嘛,因為如果中點不重合的話必然可以找到一條更長的路。
5<=n<=300,0<=s<=1000,邊權是不超過1000的正整數
⑷ 用c語言寫二叉樹,源代碼。
二叉樹是採用遞歸定義的,實現起來代碼簡潔(也許並不簡單)。並且它在具體的計算機科學中有很重要的運用,是一種很重要的數據結構,二叉樹有三種遍歷和建立的方式。今天先學習一下它的建立和列印。
以下代碼在Win-Tc1.9.1下編譯通過。
#include <stdio.h>
#define ElemType char
//節點聲明,數據域、左孩子指針、右孩子指針
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序建立二叉樹
BiTree CreateBiTree(){
char ch;
BiTree T;
scanf("%c",&ch);
if(ch=='#')T=NULL;
else{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = CreateBiTree();
T->rchild = CreateBiTree();
}
return T;//返回根節點
}
//先序遍歷二叉樹
void PreOrderTraverse(BiTree T){
if(T){
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍歷
void InOrderTraverse(BiTree T){
if(T){
PreOrderTraverse(T->lchild);
printf("%c",T->data);
PreOrderTraverse(T->rchild);
}
}
//後序遍歷
void PostOrderTraverse(BiTree T){
if(T){
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
printf("%c",T->data);
}
}
void main(){
BiTree T;
T = CreateBiTree();//建立
PreOrderTraverse(T);//輸出
getch();
}
⑸ 有關樹的編程,用C語言描述
看數據結構的書去,書上都有具體的演算法,稍微修改一下就可以了,我給你看一個我現在正在做的一個二分查找代碼填空習題:核心代碼如下
intinsert_key(BSTree*root,intkey)
{
BiTnode*father=NULL,*p=root,*s;
while(p!=NULL&&key!=p->key_value)
{
father=p;
if(key<p->key_value)p=p->left;
elsep=p->right;
}
/*這個是二分查找的代碼,至於怎麼輸出這個范圍內的,不用我教你了吧?
做個循環就可以了
*/
……
}