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
}
posted @ 2023-05-15 18:08  小星code  阅读(14)  评论(0)    收藏  举报