【面試題】二叉樹: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,那麼在左子...