Add solution 623

This commit is contained in:
YDZ
2021-03-09 22:30:36 +08:00
parent 2e7dd977c4
commit 1eac64966f
26 changed files with 626 additions and 289 deletions

View File

@ -0,0 +1,42 @@
package leetcode
import (
"github.com/halfrost/LeetCode-Go/structures"
)
// TreeNode define
type TreeNode = structures.TreeNode
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func addOneRow(root *TreeNode, v int, d int) *TreeNode {
if d == 1 {
tmp := &TreeNode{Val: v, Left: root, Right: nil}
return tmp
}
level := 1
addTreeRow(root, v, d, &level)
return root
}
func addTreeRow(root *TreeNode, v, d int, currLevel *int) {
if *currLevel == d-1 {
root.Left = &TreeNode{Val: v, Left: root.Left, Right: nil}
root.Right = &TreeNode{Val: v, Left: nil, Right: root.Right}
return
}
*currLevel++
if root.Left != nil {
addTreeRow(root.Left, v, d, currLevel)
}
if root.Right != nil {
addTreeRow(root.Right, v, d, currLevel)
}
*currLevel--
}

View File

@ -0,0 +1,68 @@
package leetcode
import (
"fmt"
"testing"
"github.com/halfrost/LeetCode-Go/structures"
)
type question623 struct {
para623
ans623
}
// para 是参数
// one 代表第一个参数
type para623 struct {
one []int
v int
d int
}
// ans 是答案
// one 代表第一个答案
type ans623 struct {
one []int
}
func Test_Problem623(t *testing.T) {
qs := []question623{
{
para623{[]int{4, 2, 6, 3, 1, 5, structures.NULL}, 1, 2},
ans623{[]int{4, 1, 1, 2, structures.NULL, structures.NULL, 6, 3, 1, 5, structures.NULL}},
},
{
para623{[]int{4, 2, structures.NULL, 3, 1}, 1, 3},
ans623{[]int{4, 2, structures.NULL, 1, 1, 3, structures.NULL, structures.NULL, 1}},
},
{
para623{[]int{1, 2, 3, 4}, 5, 4},
ans623{[]int{1, 2, 3, 4, structures.NULL, structures.NULL, structures.NULL, 5, 5}},
},
{
para623{[]int{4, 2, 6, 3, 1, 5}, 1, 3},
ans623{[]int{4, 2, 6, 1, 1, 1, 1, 3, structures.NULL, structures.NULL, 1, 5}},
},
{
para623{[]int{4, 2, 6, 3, 1, 5}, 1, 1},
ans623{[]int{1, 4, structures.NULL, 2, 6, 3, 1, 5}},
},
}
fmt.Printf("------------------------Leetcode Problem 623------------------------\n")
for _, q := range qs {
_, p := q.ans623, q.para623
fmt.Printf("【input】:%v ", p)
root := structures.Ints2TreeNode(p.one)
fmt.Printf("【output】:%v \n", structures.Tree2Preorder(addOneRow(root, p.v, p.d)))
}
fmt.Printf("\n\n\n")
}

View File

@ -0,0 +1,110 @@
# [623. Add One Row to Tree](https://leetcode.com/problems/add-one-row-to-tree/)
## 题目
Given the root of a binary tree, then value `v` and depth `d`, you need to add a row of nodes with value `v` at the given depth `d`. The root node is at depth 1.
The adding rule is: given a positive integer depth `d`, for each NOT null tree nodes `N` in depth `d-1`, create two tree nodes with value `v` as `N's` left subtree root and right subtree root. And `N's` **original left subtree** should be the left subtree of the new left subtree root, its **original right subtree** should be the right subtree of the new right subtree root. If depth `d` is 1 that means there is no depth d-1 at all, then create a tree node with value **v** as the new root of the whole original tree, and the original tree is the new root's left subtree.
**Example 1:**
```
Input:
A binary tree as following:
4
/ \
2 6
/ \ /
3 1 5
v = 1d = 2Output:
4
/ \
1 1
/ \
2 6
/ \ /
3 1 5
```
**Example 2:**
```
Input:
A binary tree as following:
4
/
2
/ \
3 1
v = 1d = 3Output:
4
/
2
/ \
1 1
/ \
3 1
```
**Note:**
1. The given d is in range [1, maximum depth of the given tree + 1].
2. The given binary tree has at least one tree node.
## 题目大意
给定一个二叉树根节点为第1层深度为 1。在其第 d 层追加一行值为 v 的节点。添加规则给定一个深度值 d (正整数),针对深度为 d-1 层的每一非空节点 N为 N 创建两个值为 v 的左子树和右子树。将 N 原先的左子树连接为新节点 v 的左子树 N 原先的右子树连接为新节点 v 的右子树。如果 d 的值为 1深度 d - 1 不存在,则创建一个新的根节点 v原先的整棵树将作为 v 的左子树。
## 解题思路
- 这一题虽然是 Medium实际非常简单。给二叉树添加一行用 DFS 或者 BFS遍历过程中记录行数到达目标行一行增加节点即可。不过需要注意 2 个特殊情况,特殊情况一,`d==1`,此时需要添加的行即为根节点。特殊情况二,`d>height(root)`,即要添加的行数比树还要高,这时只需要在最下层的叶子节点添加一层。时间复杂度 O(n),空间复杂度 O(n)。
## 代码
```go
package leetcode
import (
"github.com/halfrost/LeetCode-Go/structures"
)
// TreeNode define
type TreeNode = structures.TreeNode
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func addOneRow(root *TreeNode, v int, d int) *TreeNode {
if d == 1 {
tmp := &TreeNode{Val: v, Left: root, Right: nil}
return tmp
}
level := 1
addTreeRow(root, v, d, &level)
return root
}
func addTreeRow(root *TreeNode, v, d int, currLevel *int) {
if *currLevel == d-1 {
root.Left = &TreeNode{Val: v, Left: root.Left, Right: nil}
root.Right = &TreeNode{Val: v, Left: nil, Right: root.Right}
return
}
*currLevel++
if root.Left != nil {
addTreeRow(root.Left, v, d, currLevel)
}
if root.Right != nil {
addTreeRow(root.Right, v, d, currLevel)
}
*currLevel--
}
```