【二叉树专题】—— 完全二叉树的结点数、翻转二叉树

LeetCode 222:完全二叉树的结点数

在这里插入图片描述
📖解题思路:

(1)完全二叉树的特殊情况就是满二叉树,除叶子结点以外,每个结点都有两个孩子结点

(2)设置一个方法计算左子树的高度和计算右子树的(最大)高度

(3)如果两子树的高度相同

  • 可以说明左子树为满二叉树
    在这里插入图片描述
  • 否则右子树为满二叉树
    在这里插入图片描述

(4)对于非满二叉树的子树递归调用当前的算法来求结点个数

(5)整个完全二叉树的结点为: 左子树的所有结点、右子树的所有结点、根结点

🦋 Java代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    
    public int hight(TreeNode root){
        int countNums = 0;
        while(root != null){
            root = root.left;
            countNums++;
        }
        return countNums;
    }
    public int countNodes(TreeNode root) {
        
        //当前结点为空
        if(root == null){
            return 0;
        }

        //记录左子树和右子树的最大高度
        int leftHight = hight(root.left);
        int rightHight = hight(root.right);

        //如果左子树和右子树的高度相同,那么为左子树满二叉树
        //递归求右子树的结点,直至递归剩最后一个结点
        if(leftHight == rightHight){
            return ((1 << leftHight) - 1) + countNodes(root.right) + 1;
        }else{
            //因为是完全二叉树,所以另一种情况就是左子树的高度比右子树的高度大
            //那么右子树为满二叉树,左子树的结点数来利用递归计算
            return ((1 << rightHight) - 1) + countNodes(root.left) + 1;
        }
    }
}

🐟 补充:

位移运算符

  • >>右移一位相当于除2 【右移n为相当于除2^n,可替代某些除法运算】
  • <<左移一位相当于乘2 【左移n为相当于乘2^n,可以代替2的幂运算】
  • >>>为无符号右移,空位补零

LeetCode 226: 翻转二叉树

在这里插入图片描述

📖 解题思路:

采用由上至下的递归处理方法,交换左右子树[改变树的结构,而不是交换结点的值]
重复问题:递归左子树与右子树
递归结束:当前结点为空
之所以不采用交换结点处的值的方法,是因为可能会出现空指针异常

🐒 Java代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    
    public TreeNode invertTree(TreeNode root) {
		//当前结点为空结束递归
        if(root == null){
            return null;
        }
		//交换当前结点的左右子树
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;

        //递归遍历左子树和右子树
        invertTree(root.left);
        invertTree(root.right);

        //返回根结点
        return root;
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bow.贾斯汀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值