//二叉樹遍曆/*順序儲存完全二叉樹:這個既不浪費空間,又可以根據公式計算出每一個節點的左右孩子的位置。鏈式儲存結構:比較適用於節點比較少的二叉樹。*///節點結構如下:typedef struct Node{DataType data;struct Node *LChild;struct Node *RChild;}BiTNode,*BiTree;/*二叉樹的遍曆1.根-左子樹-右子樹(DLR)*先序遍曆2.根-右子樹-左子樹(DRL)3.左子樹-根-右子樹(LDR)*中序遍曆4.左子樹-右子樹-根(LRD)*後序遍曆5.右子樹-根-左子樹(RDL)6.右子樹-左子樹-根(RLD)*//*遍曆遞迴過程1.先序遍曆訪問根結點遍曆左子樹遍曆右子樹2.中序遍曆遍曆左子樹訪問根結點遍曆右子樹3.後序遍曆遍曆左子樹遍曆右子樹訪問根結點*//*中序遍曆的非遞迴演算法演算法思想:只要當前節點存在,或者棧不為空白,則重複下面操作如果當前節點存在,那麼進棧並且走進左子樹負責退棧並且訪問,然後走進右子樹。*/void InOrder(BiTree root){IniStack(&S);;p=root;while(p!=NULL||IsEmpty(S)){if(p!=NULL){Push(&S,p);p=p->left;}else{Pop(&S,&p);Visit(p->data);p=p->right;}}}/*後序遍曆二叉樹的非遞迴演算法演算法思想:只要當前節點存在,或者棧不為空白,就重複下面操作。1.從當前節點開始,進棧並走入左子樹,直到左子樹為空白2.如果棧頂節點的右子樹為空白,或者棧頂節點的右孩子為剛放訪問過的節點,那麼退棧並且訪問,將當前節點指標置為空白。3.否則,走右子樹*/void InOrder(BiTree root){InitStack(&S);p=root;q=NULL;while(p!=NULL||!IsEmpty(S)){while(p!=NULL)//一直訪問到最後一個左子樹{PushStack(p);p=p->left;}if(!IsEmpty(S)){PopStack(p);//出棧,取棧頂元素if(p->right==NULL||p->right==q)//無右孩子,或者右孩子已經被遍曆過{//訪問根節點visit(p->data);q=p;p=NULL;//這樣是為了不再訪問第二個while迴圈函數}else{p=p->right;//訪問右孩子}}}}//樹轉換為二叉樹/*很簡單,左孩子,右兄弟*///森林轉換為二叉樹/*多個樹在一起就是森林,所以多個樹是兄弟,然後同樣用左孩子,右兄弟表示*///樹的遍曆/*1.先根遍曆訪問根節點從左至右依次訪問子樹2.後根遍曆從左至右依次訪問子樹訪問根節點*///哈弗曼樹(又叫做最有二叉樹)//由n個帶權葉子節點所構成的所有二叉樹中帶權路徑長度最短的二叉樹/*構造方法(貪心演算法)①首先把 n 個葉子結點看做 n 棵樹(僅有一個結點的二叉樹),把它們看做一個森林。②在森林中把權值最小和次小的兩棵樹合并成一棵樹,該樹根結點的權值是兩棵子樹權值之和。這時森林中還有 n-1 棵樹。③重複第②步直到森林中只有一棵為止。此樹就是哈夫曼樹。*//*昨天做了一道筆試題,求一個數組中的最大最小值的最小時間複雜度直接說思想(昨天腦子短路了,這麼簡單的想法都想不到,BS自己一下)假如說是隨便幾個數字1,2,3,4,5,6,首先是第一個數字是最大值又是最小值從第二個數字開始比較,迴圈入下1.如果下一個數比最大值大,直接讓最大值變為這個數,那麼就不用比較最小值的了2.如果下一個數比最大值小,那麼再跟最小值比較。根據上面理論如果順序的話最小時間複雜度是n-1(所給序列為1,2,3,4,5,6,7,...n)最壞時間複雜度是2(n-1)(所給序列為n,n-1,n-2...1)*/