從中序與後序遍歷序列構造二叉樹
阿新 • • 發佈:2021-02-01
提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件
從中序與後序遍歷序列構造二叉樹
題目描述
根據一棵樹的中序遍歷與後序遍歷構造二叉樹。注意:
你可以假設樹中沒有重複的元素。
例如,給出
中序遍歷 inorder = [9,3,15,20,7]
後序遍歷 postorder = [9,15,7,20,3]
返回如下的二叉樹:
注意:題目來自leetcode
解題過程
解題思路
利用遞迴方法,遞迴呼叫自己,適當時機判斷返回條件。
根據後序遍歷的思想,後序遍歷陣列最後一個元素就是根節點。
1、遞迴函式中首先判斷中序遍歷陣列中的左索引是否大於右索引,若是,則返回null;
2、用一個全域性變數(post_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 []in_order;
int []post_order;
int post_idx;
Map<Integer, Integer> idx_map = new HashMap<Integer, Integer>();
public TreeNode helper(int in_left, int in_right){
if(in_left > in_right){
return null;
}
int root_val = post_order[post_idx];//根節點的值
TreeNode node = new TreeNode(root_val);
post_idx--;
int index = idx_map.get(root_val);
node.right = helper(index + 1,in_right);
node.left = helper(in_left, index - 1);
return node;
}
public TreeNode buildTree(int[] inorder, int[] postorder) {
this.in_order = inorder;
this.post_order = postorder;
post_idx = post_order.length-1;//後序遍歷最後一個元素
int idx = 0;
//把中序遍歷的值用索引對應起來
for(int in:inorder){
idx_map.put(in, idx++ );
}
TreeNode root = helper(0, inorder.length - 1);
return root;
}
}