【剑指offer】面试题07. 重建二叉树(Java)
輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請(qǐng)重建該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)的數(shù)字。
?
例如,給出
前序遍歷 preorder =?[3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:
? ? 3
? ?/ \
? 9 ?20
? ? / ?\
? ?15 ? 7
?
限制:
0 <= 節(jié)點(diǎn)個(gè)數(shù) <= 5000
代碼:
/**
?*?Definition?for?a?binary?tree?node.
?*?public?class?TreeNode?{
?*?????int?val;
?*?????TreeNode?left;
?*?????TreeNode?right;
?*?????TreeNode(int?x)?{?val?=?x;?}
?*?}
?*/
class?Solution?{
????public?TreeNode?buildTree(int[]?preorder,?int[]?inorder)?{
????????if(preorder.length==0||inorder.length==0){
????????????return?null;
????????}
????????Map<Integer,Integer>?map?=?new?HashMap<>();
????????for(int?i=0;i<inorder.length;i++){
????????????map.put(inorder[i],i);
????????}
????????TreeNode?node?=?find(preorder,0,preorder.length-1,inorder,0,inorder.length-1,map);
????????return?node;
????}
????public?TreeNode?find(int?preorder[],int?prestart,int?preend,int?inorder[],int?instart,int?inend,Map<Integer,Integer>?map)
????{
????????if(prestart>preend){
????????????return?null;
????????}
????????TreeNode?node?=?new?TreeNode(preorder[prestart]);
????????if(preend==prestart){
????????????return?node;
????????}else{
????????????int?rootindex?=?map.get(preorder[prestart]);
????????????int?leftnodes?=?rootindex-instart;//左子樹多少個(gè)節(jié)點(diǎn)
????????????int?rightnodes?=?inend-rootindex;//右子樹多少個(gè)節(jié)點(diǎn)
????????????TreeNode?left?=?find(preorder,prestart+1,prestart+leftnodes,inorder,instart,rootindex-1,map);
????????????TreeNode?right?=?find(preorder,preend-rightnodes+1,preend,inorder,rootindex+1,inend,map);
????????????node.left?=?left;
????????????node.right?=?right;
????????????return?node;
????????}
????}
}
總結(jié)
以上是生活随笔為你收集整理的【剑指offer】面试题07. 重建二叉树(Java)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中关于自增自减
- 下一篇: 【剑指offer】面试题38:字符串的排