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;
}
}