leetcode刷題筆記一百零五題 從前序與中序遍歷序列構造二叉樹
阿新 • • 發佈:2020-08-04
leetcode刷題筆記一百零五題 從前序與中序遍歷序列構造二叉樹
問題描述:
根據一棵樹的前序遍歷與中序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重複的元素。例如,給出
前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:3
/
9 20
/
15 7
/** 本題是從中序與前序構成樹的結構問題,這類問題關鍵在於尋找根節點,在中序遍歷中利用根節點,分為左子樹與右子樹區間處理 */ /** * Definition for a binary tree node. * class TreeNode(var _value: Int) { * var value: Int = _value * var left: TreeNode = null * var right: TreeNode = null * } */ object Solution { def buildTree(preorder: Array[Int], inorder: Array[Int]): TreeNode = { def helper(preorder: Array[Int], inorder: Array[Int], preLeft: Int, preRight: Int, inLeft: Int, inRight: Int): TreeNode = { //遞迴終止條件 if (preLeft > preRight || inLeft > inRight) return null //根節點 val pivot = preorder(preLeft) val root = new TreeNode(pivot) val pivotIndex = inorder.indexOf(pivot) root.left = helper(preorder, inorder, preLeft+1, preLeft+pivotIndex-inLeft, inLeft, pivotIndex-1) root.right = helper(preorder, inorder, preLeft+1+pivotIndex-inLeft, preRight, pivotIndex+1, inRight) return root } if (preorder.length != inorder.length) return null return helper(preorder, inorder, 0, preorder.length-1, 0, inorder.length-1) } }