首页 > 其他分享 >LEETCODE 222. 完全二叉树的节点个数

LEETCODE 222. 完全二叉树的节点个数

时间:2022-12-16 19:13:16浏览次数:39  
标签:node right return nil 222 二叉树 root LEETCODE left

递归

递归很简单,遍历整棵树即可,代码复杂度为O(n)

点击查看代码
func countNodes(root *TreeNode) int {
    if root == nil {
        return 0
    }
    return 1+countNodes(root.Left)+countNodes(root.Right)
}

二分查找

二分查找的思路如下图所示

最难的部分应该是判断某个节点是否存在,需要结合完全二叉树的性质,只要给出一个n就可以构造出从根节点到该叶子节点的路径,我们找到之后判断该节点是否为nil即可。

点击查看代码

func countNodes(root *TreeNode) int {
	if root == nil {
		return 0
	}
	var bigLeft, bigRight = getRange(root)
	var left, right = bigLeft, bigRight
	for left < right {
		var mid = left + (right-left)/2
		if ex(root, bigLeft, bigRight, mid) {
			left = mid + 1
		} else {
			right = mid
		}
	}
	return left - 1
}

//左闭右开
func getRange(root *TreeNode) (int, int) {
	if root == nil {
		return 0, 0
	}
	var res = 1
	var node = root
	for node.Left != nil {
		res = res * 2
		node = node.Left
	}
	return res, res * 2
}

func ex(root *TreeNode, left int, right int, n int) bool {
	if root == nil {
		return false
	}
	if root.Left == nil && root.Right == nil {
		return n == 1
	}
	var node = root
	for node != nil && left < right {
		var mid = left + (right-left)/2
		if right-left == 1 {
			node = node.Left
			break
		}
		if right-left == 2 {
			if n == left {
				node = node.Left
			} else if n == left+1 {
				node = node.Right
			}
			break
		}
		if left <= n && n < mid {
			node = node.Left
			right = mid
		} else if mid <= n && n < right {
			node = node.Right
			left = mid
		}
	}
	return node != nil
}

标签:node,right,return,nil,222,二叉树,root,LEETCODE,left
From: https://www.cnblogs.com/virgildevil/p/16988105.html

相关文章

  • 二叉树的遍历
    1.二叉树的遍历二叉树主要有两种遍历方式:深度优先遍历:先往深走,遇到叶子节点再往回走。前序遍历(递归法,迭代法)中左右中序遍历(递归法,迭代法) 左中右后序遍历(递归法,迭代......
  • 【LeetCode】题解合集(JavaScript版)
    前言:今年断断续续写了些LeetCode题目,一方面是为了一个比较现实的问题——面试,最重要的是要复习之前学习的数据结构与算法。后面有时间还会接续刷题…题解合集:题号题目题解1......
  • LeetCode 53_最大子数组和
    LeetCode53:最大子数组和题目给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例......
  • 二叉树前中后序递归遍历完整代码【超简单易懂】
    //二叉树的前中后序遍历【递归法】#include<iostream>usingnamespacestd;//结点结构体typedefstructBTnode{ chardata;//自己的数据 BTnode*lch......
  • [LeetCode] 1785. Minimum Elements to Add to Form a Given Sum
    Youaregivenanintegerarray nums andtwointegers limit and goal.Thearray nums hasaninterestingpropertythat abs(nums[i])<=limit.Return the......
  • [LeetCode]004-寻找两个正序数组的中位数
    >>>传送门题目给定两个大小分别为m和n的正序(从小到大)数组 nums1和 nums2。请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为O(log(m+n))。......
  • 正则表达式 判断 连号如“123456”、同号如“888888”、连同号如“112233”“222333”
    import java.util.regex.Matcher;    import java.util.regex.Pattern;        public class Regu {            public static voi......
  • 104. 二叉树的最大深度
    给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树[3,9,20,null,null......
  • LeetCode HOT 100:旋转图像
    题目:48.旋转图像题目描述:给你一个正方形矩阵数组,将其中的所有元素都顺时针旋转90度,得到旋转之后的矩阵数组。本题要求必须在原地修改,不能使用额外空间。思路:看到这个......
  • LeetCode 题解 2487. 从链表中移除节点
    2487.从链表中移除节点-力扣(Leetcode)题解思路一:递归逆序structListNode*removeNodes(structListNode*head){if(head->next==NULL)//遍历到链表末尾......