劍指Offer(面試題19 23)

2021-07-24 08:49:17 字數 1821 閱讀 1900

面試題19:二叉樹的映象

題目:請完成乙個函式,輸入乙個二叉樹,該函式輸出它的映象。

二叉樹結點的定義如下:

求一棵樹的映象的過程:先前序遍歷這棵樹的每個結點,如果遍歷到的結點有子節點,就交換它的兩個子結點。當交換完所有非葉子結點的左右子結點之後,就得到了樹的映象。

void mirrorrecursively(binarytreenode *pnode)

面試題20:順時針列印矩陣題目:輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。例如:如果輸入如下矩陣:

則依次列印出數字1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10。

void printmatrixclockwisely(int** numbers,int columns,int rows)

}void printmatrixincircle(int** numbers,int columns,int rows,int start)

//從上到下列印一列

if(startfor(int i=start+1;i<=endy;++i)

}//從右到左列印一行

if(startfor(int i = endx - 1;i>=start;--i)

}//從下往上列印一列

if(start1)

}

}

面試題22:棧的壓入、彈出序列題目:輸入兩個整數序列,第一序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1、2、3、4、5是某棧的壓棧序列,序列4、5、3、2、1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該棧序列的彈出序列。

判斷乙個序列是不是棧的彈出序列的規律:如果下乙個彈出的數字剛好是棧頂數字,那麼直接彈出。如果下乙個彈出的數字不在棧頂,我們把壓棧序列中還沒有入棧的數字壓入輔助棧,知道把下乙個需要彈出的數字壓入棧頂為止。如果所有的數字都壓入棧了仍然沒有找到下乙個彈出的數字,那麼該序列不可能是乙個彈出序列。

**如下:

bool ispoporder(const

int* ppush,const

int* ppop,int nlength)

if(stackdata.top() != *pnextpop)

break;

stackdata.pop();

pnextpop ++;

}if(stackdata.empty() && pnextpop - ppop ==nlength)

bpossible = true;

}return bpossible;

}

面試題23:從上往下列印二叉樹題目:從上往下列印出二叉樹的每個結點,同一層的結點按照從左到右的順序列印。例如輸入圖4.5中的二叉樹,則依次列印出8、6、10、5、7、9、11。

}參考文獻《劍指offer》

劍指offer面試題7

面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...

劍指offer面試題11

面試題1 數值的整數的次方 題目 實現函式double power double base,int exponent 求base的 exponent次方。不得使用庫函式,同時不需要考慮大數問題。思路 首先應該明確指數的可能取值 正整數,0,負整數 另外還需要考慮底數是0的情形。對於負整指數,我們可以...

劍指offer面試題15

面試題15 鍊錶中倒數第k個結點 題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第乙個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個結點是值為4的結點。預備知識 鍊錶結點的定義如下 ...