關於樹的一些基本操作,本來把自己的一些研究寫出來!方便大家學習!
樹可以以陣列的形式存放,也可以以鍊錶的形式存放!根據程式不同的需要選擇不同的存放形式!陣列的操作比較簡單作有限!本文不做研究!本文只是對鏈式儲存,做了一些簡單的研究!
樹的鍊錶形式:
struct node2
;也可以是:
struct node3
;二叉樹二叉鍊錶的生成演算法有兩種:
演算法一(迭代):
#define n 50
struct node2* creat()
printf("the i=?,the x=? /n");
scanf("the i=%d,the x=%d",&i,&x);
printf("/n");
}return(t);
} 演算法二(遞迴):
void create(struct node2* t)
else
t->data=ch;
create(t->lch);
create(t->rch);} }
遍歷二叉數:
先根遍歷:
void preorder(struct node2 *p)
}中根遍歷:
void inorder(struct node2 *p)
}後根遍歷:
void postorder(struct node2 *p)
}線索二插數:
struct nodex
/* ltage=0 表示lch指向左孩子 */
/* ltage=1 表示lch指向直接前驅 */
/* rtage=0 表示rch指向右孩子 */
/* rtage=1 表示rch指向直接後續 */
中根次序線索化演算法有兩種:
演算法一(遞迴):
void inthread(struct nodex *p)
else
if(pr!=null)
else
}pr=p;
inthread(p->rch);
}}
演算法二(迭代):
void inthread(struct nodex *t)
printf("%4d",p->data);
while((p->rtag==1)&&(p->rch!=t)
p=p->rch;}}
在中根線索樹中檢索某結點的前驅和後續:
找前驅:
struct nodex *impre(struct nodex *q)
p=r;
}return(p);
}找後續:
struct nodex *insucc(struct nodex *q)
else
p=r;
}return(p);
} 在中根線索樹上遍歷二叉樹:
typedef char datatype
void inthorder(struct nodex *t)
}printf("%4c",p->data);
while(p->rch!=null)
}二叉排序樹:
struct nodb
;二叉排序樹插入:
void insert(struct nodb *t,struct nodb *s)
二插排序樹的建立:
struct nodb *creat()
return(t);
}二叉排序樹上查詢結點:
struct nodb *find(struct nodb *t,int x)
return(p);
}哈夫曼樹:
struct nodeh
;哈夫曼樹演算法的實現:
#define max 50
int huffman(struct nodeh r[max])
i=0;
while(i elseif((r[j].data }r[x1].tag=1; r[x2].tag=1; i++; r[n+i].data=r[x1].data+r[x2].data; r[n+i].tag=0; r[n+i].lch=x1; r[n+i].rch=x2; }t=2*n-1; return(t); } 本章內容討論的是一般意義上的樹,即子結點個數不限且子結點沒有先後次序的樹。建議使用靜態寫法,即用陣列下標來代替所謂的位址。這需要事先開乙個大小不低於結點上限個數的結點陣列。struct node node maxn 結點陣列,maxn為結點上限個數而child陣列的長度由於無法預知子結點個數只能開到... 輸入輸入某二叉樹的前序遍歷和中序遍歷的結果,請重構該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不包含重複的數字。例如,輸入前序遍歷序列和中序遍歷序列,重建該樹。樹的結點類如下 class treenode 通過前序遍歷獲取根節點的值,然後遍歷中序遍歷序列,找到根節點,將中序遍歷陣列分成左右兩個樹... 題目名稱 2056 2002湖南 營業額統計 題目簡述 description tiger 最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。tiger 拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節...演算法筆記 樹遍歷基本操作
樹的基本操作
平衡樹的基本操作