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

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

題目:

  

思路:

  根據前序遍歷的第一個數我們可以知道 根節點

  根據 根節點 去中序遍歷中可以分出左樹 與 右樹

  運用極限逼近的思想,假設只有三個資料

  前序【3,9,20】

  中序【9,3,20】

  去設計演算法: 我們將中序中的資料存入map 中 value 存值得下標,根據藍色字的思想,遞迴去構建樹


(一)程式碼 遞迴

   

class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {

        //map 中key 存中序遍歷的元素, value 存元素下標
Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for(int i= 0 ; i < inorder.length ; i++){ map.put(inorder[i],i); } return buildTreeNode(preorder,0,preorder.length,inorder,0,inorder.length,map); } public TreeNode buildTreeNode(int
[] preorder,int pre_start,int pre_end,int[] inorder,int in_start,int in_end,Map<Integer, Integer> map){ //當pre_Start == pre_End 遞迴出口 if(pre_start == pre_end){ return null; } //構建樹 TreeNode tree = new TreeNode(preorder[pre_start]); //獲取中序遍歷中root的位置
int midkey = map.get(preorder[pre_start]); //根據中序遍歷找到左邊的數量 , 通過這個去算先序遍歷的結束位置 int leftnum = midkey - in_start; tree.left = buildTreeNode(preorder,pre_start+1,pre_start+1+leftnum,inorder,in_start,midkey-1,map); tree.right = buildTreeNode(preorder,pre_start+1+leftnum,pre_end,inorder,midkey+1,in_end,map); return tree; } }

      利好白酒