【藍橋杯省賽JavaB組真題詳解】馬虎的算式(2013)
阿新 • • 發佈:2021-02-01
提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件
從前序與中序遍歷序列構造二叉樹
題目描述
根據一棵樹的前序遍歷與中序遍歷構造二叉樹。注意:
你可以假設樹中沒有重複的元素。
例如,給出
前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:
注意:題目來自leetcode
解題過程
解題思路
利用遞迴方法,遞迴呼叫自己,適當時機判斷返回條件。
根據前序遍歷的思想,前序遍歷陣列第一個元素就是根節點。
而根據根節點又可以從中序遍歷陣列中確定出左右子樹。遞迴函式傳入的值為中序遍歷陣列以根節點為分界點的左右索引
2、用一個全域性變數(pre_idx)來記錄每次遞迴的根節點對應前序遍歷中的索引。使用確定的根節點的值建立TreeNode節點。
3、建立完根節點之後,先建立左子樹,再建立右子樹;
7、遞迴結束;
程式碼如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int pre_inx;
int []pre_order;
int []in_order;
Map<Integer, Integer> idx_map = new HashMap<>();
public TreeNode recur(int in_left, int in_right){
if(in_left > in_right){
return null;
}
int root_val = pre_order[pre_inx] ;
int index = idx_map.get(root_val);
//建立根節點,從前序遍歷可以知道根節點的索引
TreeNode root = new TreeNode(root_val);
pre_inx ++;
root.left = recur(in_left, index - 1);
root.right = recur(index + 1, in_right);
return root;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.pre_inx = 0;
this.pre_order = preorder;
this.in_order = inorder;
int idx = 0;
for(int val: inorder){
idx_map.put(val, idx++);
}
TreeNode root = recur(0, inorder.length - 1);
return root;
}
}