《劍指offer》學習筆記 面試題7 重建二叉樹

2021-08-30 04:37:09 字數 1383 閱讀 7641

輸入一顆二叉樹的前序遍歷序列和中序遍歷序列,請根據這兩個序列重建一棵二叉樹。(假設輸入的前序遍歷和中序遍歷的結果都不包含重複的數字)

前序遍歷的第乙個數就是二叉樹的根結點,這個根結點通常是在中序遍歷的中間位置。在中序遍歷中,根結點左邊的數都在二叉樹的左子樹中,右邊的數都在二叉樹的右子樹中。因此通過中序遍歷,可以確定左子樹結點的個數和右子樹結點的個數。在前序遍歷中,根結點後面先是左子樹的所有結點,之後是右子樹的所有結點。

前序遍歷和中序遍歷的關係:

/*ps:前向遍歷的開始位置;

pe:前向遍歷的結束位置;

is:中序遍歷的開始位置;

ie:中序遍歷的結束位置;

*/treenode* create(vector& preorder,vector& inorder,int ps,int pe,int is,int ie)

}int leftlen = pos - is;//左子樹中的結點數

node->left = create(preorder,inorder,ps+1,ps+leftlen,is,pos-1);

node->right = create(preorder,inorder,ps+leftlen+1,pe,pos+1,ie);

return node;}};

輸入一顆二叉樹的後序遍歷序列和中序遍歷序列,請根據這兩個序列重建一棵二叉樹。(假設輸入的後序遍歷和中序遍歷的結果都不包含重複的數字)同前面的重建二叉樹的思路相似,只不過後序遍歷的根結點在序列的末尾,然後前面是所有右子樹的結點,再前面是所有左子樹的結點。

class solution 

treenode* create(vector& inorder,vector& postorder,int is,int ie,int ps,int pe)

}int rightlen = ie - pos;

node->right = create(inorder,postorder,pos+1,ie,pe-rightlen,pe-1);

node->left = create(inorder,postorder,is,pos-1,ps,pe-rightlen-1);

return node;}};

劍指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的結點。預備知識 鍊錶結點的定義如下 ...