1. 程式人生 > 其它 >【藍橋杯省賽JavaB組真題詳解】馬虎的算式(2013)

【藍橋杯省賽JavaB組真題詳解】馬虎的算式(2013)

技術標籤:二叉樹二叉樹leetcode

提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件

從前序與中序遍歷序列構造二叉樹


題目描述

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。

注意:
你可以假設樹中沒有重複的元素。

例如,給出

前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:在這裡插入圖片描述

注意:題目來自leetcode


解題過程

解題思路

利用遞迴方法,遞迴呼叫自己,適當時機判斷返回條件。
根據前序遍歷的思想,前序遍歷陣列第一個元素就是根節點。
而根據根節點又可以從中序遍歷陣列中確定出左右子樹。遞迴函式傳入的值為中序遍歷陣列以根節點為分界點的左右索引

1、遞迴函式中首先判斷中序遍歷陣列中的左索引是否大於右索引,若是,則返回null;
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; } }