Skip to content

106.从中序与后序遍历序列构造二叉树增加Go解法 #2614

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 108 additions & 0 deletions problems/0106.从中序与后序遍历序列构造二叉树.md
Original file line number Diff line number Diff line change
Expand Up @@ -794,6 +794,60 @@ func rebuild(inorder []int, postorder []int, rootIdx int, l, r int) *TreeNode {
}
```

```go
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func buildTree(inorder []int, postorder []int) *TreeNode {
if len(postorder) == 0 {
return nil
}

// 后序遍历数组最后一个元素,就是当前的中间节点
rootValue := postorder[len(postorder)-1]
root := &TreeNode{Val:rootValue}

// 叶子结点
if len(postorder) == 1 {
return root
}

// 找到中序遍历的切割点
var delimiterIndex int
for delimiterIndex = 0; delimiterIndex < len(inorder); delimiterIndex++ {
if inorder[delimiterIndex] == rootValue {
break;
}
}

// 切割中序数组
// 左闭右开区间:[0, delimiterIndex)
leftInorder := inorder[:delimiterIndex]
// [delimiterIndex + 1, end)
rightInorder := inorder[delimiterIndex+1:]

// postorder 舍弃末尾元素
postorder = postorder[:len(postorder)-1]

// 切割后序数组
// 依然左闭右开,注意这里使用了左中序数组大小作为切割点
// [0, len(leftInorder))
leftPostorder := postorder[:len(leftInorder)]
// [len(leftInorder), end)
rightPostorder := postorder[len(leftInorder):]

root.Left = buildTree(leftInorder, leftPostorder)
root.Right = buildTree(rightInorder, rightPostorder)

return root
}
```

105 从前序与中序遍历序列构造二叉树

```go
Expand Down Expand Up @@ -829,6 +883,60 @@ func build(pre []int, in []int, root int, l, r int) *TreeNode {
}
```

```go
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func buildTree(preorder []int, inorder []int) *TreeNode {
if len(preorder) == 0 {
return nil
}

// 前序遍历数组第一个元素,就是当前的中间节点
rootValue := preorder[0]
root := &TreeNode{Val:rootValue}

// 叶子结点
if len(preorder) == 1 {
return root
}

// 找到中序遍历的切割点
var delimiterIndex int
for delimiterIndex = 0; delimiterIndex < len(inorder); delimiterIndex++ {
if inorder[delimiterIndex] == rootValue {
break
}
}

// 切割中序数组
// 左闭右开区间:[0, delimiterIndex)
leftInorder := inorder[:delimiterIndex]
// [delimiterIndex + 1, end)
rightInorder := inorder[delimiterIndex+1:]

// preorder 舍弃首位元素
preorder = preorder[1:]

// 切割前序数组
// 依然左闭右开,注意这里使用了左中序数组大小作为切割点
// [0, len(leftInorder))
leftPreorder := preorder[:len(leftInorder)]
// [len(leftInorder), end)
rightPreorder := preorder[len(leftInorder):]

root.Left = buildTree(leftPreorder, leftInorder)
root.Right = buildTree(rightPreorder, rightInorder)

return root
}
```


### JavaScript

Expand Down