|
@@ -8,16 +8,34 @@ package main
|
|
|
* Right *TreeNode
|
|
|
* }
|
|
|
*/
|
|
|
-func buildTree(preorder []int, inorder []int) *TreeNode {
|
|
|
- if len(preorder) == 0 || len(preorder) != len(inorder) {
|
|
|
+func buildTreeByPreorderAndInorder(preorder []int, inorder []int) *TreeNode {
|
|
|
+ // func buildTree(preorder []int, inorder []int) *TreeNode {
|
|
|
+ nodeCnt := len(preorder)
|
|
|
+ if nodeCnt == 0 || nodeCnt != len(inorder) {
|
|
|
return nil
|
|
|
}
|
|
|
root := TreeNode{preorder[0], nil, nil}
|
|
|
+ if nodeCnt == 1 { // No children
|
|
|
+ return &root
|
|
|
+ }
|
|
|
+ var idx int
|
|
|
+ for idx = 0; idx < nodeCnt && inorder[idx] != root.Val; idx++ {
|
|
|
+ // Find the root index in inorder traversal
|
|
|
+ }
|
|
|
+ if idx != 0 { // If have left children
|
|
|
+ root.Left = buildTree(preorder[1:1+idx], inorder[0:idx])
|
|
|
+ }
|
|
|
+ if idx != nodeCnt-1 { // If have right children
|
|
|
+ root.Right = buildTree(preorder[idx+1:nodeCnt], inorder[idx+1:nodeCnt])
|
|
|
+ }
|
|
|
return &root
|
|
|
}
|
|
|
|
|
|
-func main() {
|
|
|
- printTree(buildTree(
|
|
|
- []int{3, 9, 20, 15, 7},
|
|
|
- []int{9, 3, 15, 20, 7}))
|
|
|
-}
|
|
|
+// func main() {
|
|
|
+// printTree(buildTree(
|
|
|
+// []int{1, 2, 4, 5, 3, 6, 7},
|
|
|
+// []int{4, 2, 5, 1, 6, 3, 7}))
|
|
|
+// printTree(buildTree(
|
|
|
+// []int{1, 2},
|
|
|
+// []int{1, 2}))
|
|
|
+// }
|