1. 程式人生 > 其它 >從中序與後序遍歷序列構造二叉樹

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

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

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

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


題目描述

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

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

例如,給出

中序遍歷 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; } }