LeetCode 226. 翻转二叉树
题目链接:LeetCode 226. 翻转二叉树
题意:
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
解题思路:
** 对于每一个节点,只需要考虑反转当前节点的左右子树即可,因此只需要考虑遍历顺序,本题中,采用先序和后序遍历都是可以的,但是中序遍历就需要稍加改动,**
** 因为 如果采用中序,会将某些节点反转两次,因此在遍历时,执行顺序是,先遍历左子树,反转根节点,再反转左子树(因为已经反转,此时的左子树就是之前的右子树)**
先序递归代码如下:
func invertTree(root *TreeNode) *TreeNode {
dfs(root)
return root
}
func dfs(root *TreeNode){
if root == nil{
return
}
root.Left,root.Right = root.Right,root.Left
dfs(root.Left)
dfs(root.Right)
}
先序迭代代码如下
func invertTree(root *TreeNode) *TreeNode {
var stk []*TreeNode
res:=root
for root != nil || len(stk)!= 0{
for root != nil {
root.Left,root.Right = root.Right,root.Left
stk = append(stk,root)
root = root.Left
}
root = stk[len(stk)-1].Right
stk = stk[:len(stk)-1]
}
return res
}
中序遍历的迭代写法:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func invertTree(root *TreeNode) *TreeNode {
var stk []*TreeNode
node := root
for node != nil || len(stk) > 0 {
for node != nil {
stk = append(stk,node)
node = node.Left
}
node = stk[len(stk)-1]
node.Left , node.Right = node.Right, node.Left
stk = stk[:len(stk)-1]
node = node.Left //重点是这里的变化
}
return root
}
层序遍历代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func invertTree(root *TreeNode) *TreeNode {
// var res [][]int
var query []*TreeNode //队列,记录每一层的节点
if root == nil{
return nil
}
query = append(query,root) //若头节点不空,先放入队列中
for len(query) != 0 {
// var level []int //记录每一层的节点
len := len(query)
for len > 0 {
len--
node := query[0] //队头节点
query = query[1:] //队头出队
// 反转当前节点
node.Left, node.Right = node.Right,node.Left
if node.Left != nil{
query = append(query,node.Left)
}
if node.Right != nil{
query = append(query,node.Right)
}
}
}
return root
}