【每日一题】翻转二叉树

【题目描述】
翻转一颗二叉树,依次翻转二叉树的左右孩子。

示例
输入:
在这里插入图片描述
输出:
在这里插入图片描述

思路

提供两种方法:1.自顶向下;2.自底向上。
自顶向下的方法,就是依次交换左右孩子节点,若左右孩子节点不为空,则继续交换其孩子节点,直到遍历到的节点为空;自底向上的方法,递归地对树进行遍历,并从叶子节点开始翻转。因为会遍历树中的每一个节点,因此时间复杂度为O(N),对于空间复杂度,是由递归的栈的深度决定的,平均情况下是O(logN),最坏情况下,形成链的时候,空间复杂度为O(N)。

自顶向下

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root == null)
            return null;
        if(!(root.left == null && root.right == null)){ //左右孩子节点都非空的情况
            //交换左右孩子节点
            TreeNode temp = root.right;
            root.right = root.left;
            root.left = temp;
            //如果孩子节点不为空,则继续进行交换
            if(root.left != null)
                invertTree(root.left);
            if(root.right != null)
                invertTree(root.right);
        }
        return root;
    }
}   

自底向上

class Solution {
    public TreeNode invertTree(TreeNode root) {
    	//当root节点为空时,返回空节点,递归结束
        if (root == null) {
            return null;
        }
        TreeNode left = invertTree(root.left); 
        TreeNode right = invertTree(root.right);
        //交换左右孩子节点
        root.left = right;
        root.right = left;
        return root; //遇到了叶子节点时,直接返回该节点
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值