練習題(續二)

2021-08-22 07:28:19 字數 2663 閱讀 2236

1.求二叉樹中最遠的兩個點的距離。

解析:首先分兩種情況。一種是經過根節點的最遠距離,一種是兩個節點在同一邊,又分為左子樹最遠距離和右子樹最遠距離。第一種用我們先前學過的求二叉樹深度的演算法來求出左右子樹的深度和即可。第

二、三種遞迴左右子樹,每次遞迴返回的都是三種中的最大值。這樣就能得到最遠距離了。

**:

首先我們需要求深度函式以及比較三個數大小的函式方便使用。

(1)//求樹的深度。

int treeheight(treenode *proot)

left=treeheight(proot->pleft);

right=treeheight(proot->pright);

return (left>right ? left+1 : right+1);

}//(2)求最值函式。

int max(int a,int b,int c)

if(b>a && b>c)

return c;

}//求兩個最遠節點的距離。

int treefarest(treenode *proot)

left=treefarest(proot->pleft); //求左子樹的最遠距離

right=treefarest(proot->pright); //求右子樹的最遠距離。

x=treeheight(proot->pleft);

y=treeheight(proot->pright);

m=x+y; //求左右子樹的深度和。

return max(m,left,right); //返回三者中最遠的值。

}

2.將二叉搜尋樹轉換成乙個排序的雙向鍊錶。

解析:首先要知道二叉搜尋樹的性質,那就是它的中序遍歷的結果是公升序的。而且雙向鍊錶的兩個指標可以看成是二叉樹的左右子樹指標。所以我們就從這裡出發。先寫出乙個中序遍歷,為了方便最好用遞迴方式的,然後將列印改為交換的函式即可。隨後我們只要寫出交換函式即可。在這個函式中,收到的引數就是已經排好中序的數,所以要先定義乙個全域性變數記下每次呼叫的數,在將它的左右子樹分好即可。

**:

//將二叉搜尋樹變成排序的雙向鍊錶。

bstreenode *q=null; //定義全域性變數。

void handle(bstreenode *proot) //處理函式。

proot->pleft=q; //改變左子樹。

q=proot; //記下上乙個節點。

}void bstreetolist(bstreenode *proot) //中序函式。

bstreetolist(proot->pleft);

handle(proot); //中序的節點進行handle函式操作。

bstreetolist(proot->pright);

}

3.判斷鍊錶是否帶環,若帶環求換的長度以及頭結點到交點的長度。

解析:判斷乙個鍊錶是否帶環,就定義兩個指標,乙個走一步,乙個走兩步,如果兩個指標能相遇證明帶環,否則不帶環。通過判斷可以得到相遇點,迴圈這個點可以得到環的長度。通過公式定理可知同時從頭節點和相遇點出發,兩者一定會在交點處相遇。所以迴圈就可以得到交點。

**:

//判斷鍊錶是否帶環。

int ishuan(slistnode *pfirst)

p1=p1->pnext; //p1再走一步

a++; //記下p1走的步數。

if(p1==null)

p2=p2->pnext; //p2走一步。

b++; //記下p2走的步數。

if(p1->data==p2->data) //若兩個指標相遇,證明有環。

c+=1;

printf("this huan's length is %d\n",c); //此時環的長度

while(p3->data!=p2->data) //迴圈得到頭節點到交點的距離。

printf("its entrance's length is %d\n",d);

return 1;

} }return 0;

}

4.已知二叉樹的前序與中序,建立二叉樹。

解析:首先我們要了解前序的第乙個值就是根節點,中序中這個值的左右兩邊分別為它的左右子樹。所以只需要遞迴的尋找根節點即可。

**:

//由中序和前序建立二叉樹。

treenode *gettree(char pre,char in,int len1,int len2)

for(i=0;ipleft=gettree(pre+1,in,i,i); //遞迴左子樹。

proot->pright=gettree(pre+i+1,in+i+1,len1-i,len2-1); //遞迴右子樹。

return proot; //返回根節點。

}

python練習題(二)

1.企業發放的獎金根據利潤提成。利潤 i 低於或等於10萬元時,獎金可提10 利潤高 於10萬元,低於20萬元時,低於10萬元的部分按10 提成,高於10萬元的部分,可可提 成7.5 20萬到40萬之間時,高於20萬元的部分,可提成5 40萬到60萬之間時高於 40萬元的部分,可提成3 60萬到10...

指標練習題二

void function 此處新增 使用指標,將陣列的值倒置 int x arr int z for int i 0,k 4 i 2 i k 列印陣列值的 已經寫完,不需要修改 for k 0 k 5 k 這一堆資料中儲存了角色的血值資訊,假設血值的型別為int型別,值為100 10進製 請列出所...

Python練習題(二)

1.python 裡 match 與 search 的區別?match 函式只檢測 re 是不是在 string 的開始位置匹配,search 會掃瞄整個 string 查詢匹配 也就是說 match 只有在 0 位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match 就返回 none。...