Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 4298701

Browse files
106.从中序与后序遍历序列构造二叉树增加Go解法
1 parent 717ad84 commit 4298701

File tree

1 file changed

+108
-0
lines changed

1 file changed

+108
-0
lines changed

‎problems/0106.从中序与后序遍历序列构造二叉树.md‎

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,60 @@ func rebuild(inorder []int, postorder []int, rootIdx int, l, r int) *TreeNode {
794794
}
795795
```
796796

797+
```go
798+
/**
799+
* Definition for a binary tree node.
800+
* type TreeNode struct {
801+
* Val int
802+
* Left *TreeNode
803+
* Right *TreeNode
804+
* }
805+
*/
806+
func buildTree(inorder []int, postorder []int) *TreeNode {
807+
if len(postorder) == 0 {
808+
return nil
809+
}
810+
811+
// 后序遍历数组最后一个元素,就是当前的中间节点
812+
rootValue := postorder[len(postorder)-1]
813+
root := &TreeNode{Val:rootValue}
814+
815+
// 叶子结点
816+
if len(postorder) == 1 {
817+
return root
818+
}
819+
820+
// 找到中序遍历的切割点
821+
var delimiterIndex int
822+
for delimiterIndex = 0; delimiterIndex < len(inorder); delimiterIndex++ {
823+
if inorder[delimiterIndex] == rootValue {
824+
break;
825+
}
826+
}
827+
828+
// 切割中序数组
829+
// 左闭右开区间:[0, delimiterIndex)
830+
leftInorder := inorder[:delimiterIndex]
831+
// [delimiterIndex + 1, end)
832+
rightInorder := inorder[delimiterIndex+1:]
833+
834+
// postorder 舍弃末尾元素
835+
postorder = postorder[:len(postorder)-1]
836+
837+
// 切割后序数组
838+
// 依然左闭右开,注意这里使用了左中序数组大小作为切割点
839+
// [0, len(leftInorder))
840+
leftPostorder := postorder[:len(leftInorder)]
841+
// [len(leftInorder), end)
842+
rightPostorder := postorder[len(leftInorder):]
843+
844+
root.Left = buildTree(leftInorder, leftPostorder)
845+
root.Right = buildTree(rightInorder, rightPostorder)
846+
847+
return root
848+
}
849+
```
850+
797851
105 从前序与中序遍历序列构造二叉树
798852

799853
```go
@@ -829,6 +883,60 @@ func build(pre []int, in []int, root int, l, r int) *TreeNode {
829883
}
830884
```
831885

886+
```go
887+
/**
888+
* Definition for a binary tree node.
889+
* type TreeNode struct {
890+
* Val int
891+
* Left *TreeNode
892+
* Right *TreeNode
893+
* }
894+
*/
895+
func buildTree(preorder []int, inorder []int) *TreeNode {
896+
if len(preorder) == 0 {
897+
return nil
898+
}
899+
900+
// 前序遍历数组第一个元素,就是当前的中间节点
901+
rootValue := preorder[0]
902+
root := &TreeNode{Val:rootValue}
903+
904+
// 叶子结点
905+
if len(preorder) == 1 {
906+
return root
907+
}
908+
909+
// 找到中序遍历的切割点
910+
var delimiterIndex int
911+
for delimiterIndex = 0; delimiterIndex < len(inorder); delimiterIndex++ {
912+
if inorder[delimiterIndex] == rootValue {
913+
break
914+
}
915+
}
916+
917+
// 切割中序数组
918+
// 左闭右开区间:[0, delimiterIndex)
919+
leftInorder := inorder[:delimiterIndex]
920+
// [delimiterIndex + 1, end)
921+
rightInorder := inorder[delimiterIndex+1:]
922+
923+
// preorder 舍弃首位元素
924+
preorder = preorder[1:]
925+
926+
// 切割前序数组
927+
// 依然左闭右开,注意这里使用了左中序数组大小作为切割点
928+
// [0, len(leftInorder))
929+
leftPreorder := preorder[:len(leftInorder)]
930+
// [len(leftInorder), end)
931+
rightPreorder := preorder[len(leftInorder):]
932+
933+
root.Left = buildTree(leftPreorder, leftInorder)
934+
root.Right = buildTree(rightPreorder, rightInorder)
935+
936+
return root
937+
}
938+
```
939+
832940

833941
### JavaScript
834942

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /