從前序與中序遍歷序列構造二叉樹 遞迴
阿新 • • 發佈:2021-06-28
題目:
思路:
根據前序遍歷的第一個數我們可以知道 根節點
根據 根節點 去中序遍歷中可以分出左樹 與 右樹
運用極限逼近的思想,假設只有三個資料
前序【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; } }
利好白酒