From 21e5e780cc165e2971e3a01f894939e381db5a64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?karminski-=E7=89=99=E5=8C=BB?= Date: Fri, 30 Jul 2021 00:18:32 +0800 Subject: [PATCH] Update 0106.Construct-Binary-Tree-from-Inorder-and-Postorder-Traversal.md UPDATE a new answer for less memory cost & FIX method name typo. --- ...ree-from-Inorder-and-Postorder-Traversal.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/website/content/ChapterFour/0100~0199/0106.Construct-Binary-Tree-from-Inorder-and-Postorder-Traversal.md b/website/content/ChapterFour/0100~0199/0106.Construct-Binary-Tree-from-Inorder-and-Postorder-Traversal.md index 77b102d5..27242d9f 100755 --- a/website/content/ChapterFour/0100~0199/0106.Construct-Binary-Tree-from-Inorder-and-Postorder-Traversal.md +++ b/website/content/ChapterFour/0100~0199/0106.Construct-Binary-Tree-from-Inorder-and-Postorder-Traversal.md @@ -48,7 +48,7 @@ package leetcode * Right *TreeNode * } */ -func buildTree106(inorder []int, postorder []int) *TreeNode { +func buildTree(inorder []int, postorder []int) *TreeNode { inPos := make(map[int]int) for i := 0; i < len(inorder); i++ { inPos[inorder[i]] = i @@ -68,6 +68,22 @@ func buildInPos2TreeDFS(post []int, postStart int, postEnd int, inStart int, inP return root } +// 解法 2, 直接传入需要的 slice 范围作为输入, 可以避免申请对应 inorder 索引的内存, 内存使用(leetcode test case) 4.7MB -> 4.3MB. +func buildTree(inorder []int, postorder []int) *TreeNode { + postorderLen := len(postorder) + if len(inorder) == 0 { + return nil + } + root := &TreeNode{Val:postorder[postorderLen-1]} + postorder = postorder[:postorderLen-1] + for pos, node := range inorder { + if node == root.Val { + root.Left = buildTree(inorder[:pos], postorder[:len(inorder[:pos])]) + root.Right = buildTree(inorder[pos+1:], postorder[len(inorder[:pos]):]) + } + } + return root +} ```