面試題 二叉樹

2022-09-23 20:15:12 字數 1227 閱讀 3516

【面試題】二叉樹:1.重建二叉樹(前序、中序)。

treenode* reconstructbinarytree(vector pre,vector vin)

treenode *root = new treenode(pre[0]);

int pos = 0;

for(;pos pre_left,vin_left,pre_right,vin_right;

for(int i=0;i < n1;++i)

}root->left = reconstructbinarytree(pre_left,vin_left);

root->right = reconstructbinarytree(pre_right,vin_right);

return root;

}中序、後序重建二叉樹,與前序、中序重建二叉樹思想一致。利用前序或者後序遍歷根結點的位置特性,找到中序遍歷序列中根結點的位置,進而將中序遍歷序、前序或者後序列分成左子樹、根結點、右子樹,左右子樹進行遞迴。

先序、後序無法重建二叉樹。

2.層序遍歷二叉樹

vector printfromtoptobottom(treenode* root)

return res;

}};利用佇列先進先出的思想,首先將根結點入進去,出乙個結點,如果左/右子樹不為null,將它的左/右子節點入進去。

3.二叉樹的深度

int treedepth(treenode* proot)

}利用遞迴的思想,二叉樹的深度為左右子樹深度最大值+1。

4.二叉樹是否是平衡二叉樹

//乙個節點被重複遍歷多次

int treedepth(treenode* proot)

}bool isbalanced_solution(treenode* proot) 結合求深度的方法,對二叉樹進行遞迴判斷,優點是思想容易理解,**簡潔。缺點是乙個節點被重複遍歷多次。

改進:一遍進行後序遍歷,一邊進行判斷。此時每個結點只遍歷一次。

bool isbalanced(treenode *root, int & dep)

int left = 0;

int right = 0;

if(isbalanced(root->left,left) && isbalanced(root->right, right))

return false;

}bool isbalanced_solution(treenode* proot)

二叉樹面試題

1.求二叉樹節點個數 可以使用遞迴解決。將問題分解為求根節點 左子樹的節點數 右節點的節點數。實現 public size t size private size t size node root 2.求頁節點個數 頁節點 左右子樹都為空的節點被稱為頁節點,使用遞迴遍歷,當碰到乙個左右子樹為空的節點...

二叉樹 面試題2

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。前序遍歷 dlr 中序遍歷 ldr 重建過程用遞迴演算法比較簡單 public static treenode reconstruc...

面試題 重建二叉樹

首先看到該題目,我們心裡應該清楚二叉樹的前序遍歷和中序遍歷各自有什麼特點,想不通的話可以在紙上畫一畫。前序遍歷序列中第乙個數字總是該二叉樹的根節點,但是在中序遍歷序列中根節點在中間,結合兩個序列,我們很容易就能知道二叉樹的根節點以及左右子樹,如下圖所示 依照這種方法,第二遍查詢根節點為2,那麼在左子...