617.合并二叉树,116.填充每个节点的下一个右侧节点指针
合并二叉树
深度优先搜索
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
if root1==nil{
return root2
}
if root2==nil{
return root1
}
root1.Val+=root2.Val
root1.Left=mergeTrees(root1.Left,root2.Left)
root1.Right=mergeTrees(root1.Right,root2.Right)
return root1
}
广度优先搜索
func mergeTrees(t1, t2 *TreeNode) *TreeNode {
if t1 == nil {
return t2
}
if t2 == nil {
return t1
}
merged := &TreeNode{Val: t1.Val + t2.Val}
queue := []*TreeNode{merged}
queue1 := []*TreeNode{t1}
queue2 := []*TreeNode{t2}
for len(queue1) > 0 && len(queue2) > 0 {
node := queue[0]
queue = queue[1:]
node1 := queue1[0]
queue1 = queue1[1:]
node2 := queue2[0]
queue2 = queue2[1:]
left1, right1 := node1.Left, node1.Right
left2, right2 := node2.Left, node2.Right
if left1 != nil || left2 != nil {
if left1 != nil && left2 != nil {
left := &TreeNode{Val: left1.Val + left2.Val}
node.Left = left
queue = append(queue, left)
queue1 = append(queue1, left1)
queue2 = append(queue2, left2)
} else if left1 != nil {
node.Left = left1
} else { // left2 != nil
node.Left = left2
}
}
if right1 != nil || right2 != nil {
if right1 != nil && right2 != nil {
right := &TreeNode{Val: right1.Val + right2.Val}
node.Right = right
queue = append(queue, right)
queue1 = append(queue1, right1)
queue2 = append(queue2, right2)
} else if right1 != nil {
node.Right = right1
} else { // right2 != nil
node.Right = right2
}
}
}
return merged
}
来源:力扣(LeetCode)
填充每个节点的下一个右侧节点指针
层次遍历
/**
* Definition for a Node.
* type Node struct {
* Val int
* Left *Node
* Right *Node
* Next *Node
* }
*/
func connect(root *Node) *Node {
if root == nil {
return root
}
// 初始化队列同时将第一层节点加入队列中,即根节点
queue := []*Node{root}
// 循环迭代的是层数
for len(queue) > 0 {
tmp := queue
queue = nil
// 遍历这一层的所有节点
for i, node := range tmp {
// 连接
if i+1 < len(tmp) {
node.Next = tmp[i+1]
}
// 拓展下一层节点
if node.Left != nil {
queue = append(queue, node.Left)
}
if node.Right != nil {
queue = append(queue, node.Right)
}
}
}
// 返回根节点
return root
}
使用已经建立的next指针
func connect(root *Node) *Node {
if root == nil {
return root
}
// 每次循环从该层的最左侧节点开始
for leftmost := root; leftmost.Left != nil; leftmost = leftmost.Left {
// 通过 Next 遍历这一层节点,为下一层的节点更新 Next 指针
for node := leftmost; node != nil; node = node.Next {
// 左节点指向右节点
node.Left.Next = node.Right
// 右节点指向下一个左节点
if node.Next != nil {
node.Right.Next = node.Next.Left
}
}
}
// 返回根节点
return root
}
来源:力扣(LeetCode)