LeetCode222. 完全二叉树的节点个数-Java&Go-DFS | BFS

完全二叉树结点数

http://www.nowcoder.com/questionTerminal/512688d2ecf54414826f52df4e4b5693

  • 算法
    • 1.DFS-递归
    • 2.递归
      • 根节点为null时,共有0个节点
      • 根节点不为null时,节点个数等于根节点+左子树节点个数+右子树节点个数
    • 3.优化
      • 当最左子节点和最右子节点深度相同时,这是一个满二叉树,节点个数可以直接计算为2^深度 - 1
public int countNodes(TreeNode root) {
    if (root == null) {
        return 0;
    }
    return 1 + countNodes(root.left) + countNodes(root.right);
}

public int countNodes(TreeNode root) {
    if (root == null) {
        return 0;
    }

    int level = 0;
    TreeNode l = root, r = root;
    while (l != null && r != null) {
        level++;
        l = l.left;
        r = r.right;
    }

    if (l == null && r == null) {
        return (1 << level) - 1;
    } else {
        return 1 + countNodes(root.left) + countNodes(root.right);
    }
}
func countNodes(root *TreeNode) int {
    if root == nil {
        return 0
    }
    return 1 + countNodes(root.Left) + countNodes(root.Right)
}

func countNodes(root *TreeNode) int {
    if root == nil {
        return 0
    }

    level := 0
    l, r := root, root
    for l != nil && r != nil {
        level++
        l, r = l.Left, r.Right
    }

    if l == nil && r == nil {
        return (1 << level) - 1
    } else {
        return 1 + countNodes(root.Left) + countNodes(root.Right)
    }
}
  • 算法
    • 1.BFS-层次遍历
    • 2.队列进行层次遍历
public int countNodes(TreeNode root) {
    if (root == null) {
        return 0;
    }

    int sum = 0;
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    while (!queue.isEmpty()) {
        int size = queue.size();
        sum += size;
        while (size-- > 0) {
            TreeNode curr = queue.poll();
            if (curr.left != null) {
                queue.offer(curr.left);
            }
            if (curr.right != null) {
                queue.offer(curr.right);
            }
        }
    }
    return sum;
}
func countNodes(root *TreeNode) int {
    if root == nil {
        return 0
    }

    sum, queue := 0, list.New()
    queue.PushBack(root)
    for queue.Len() > 0 {
        size := queue.Len()
        sum += size
        for size > 0 {
            curr := queue.Remove(queue.Front()).(*TreeNode)
            if curr.Left != nil {
                queue.PushBack(curr.Left)
            }
            if curr.Right != nil {
                queue.PushBack(curr.Right)
            }
            size--
        }
    }
    return sum
}
全部评论

相关推荐

昨天 14:14
门头沟学院 Java
7.10投递7.15感谢信
投递地平线等公司7个岗位
点赞 评论 收藏
分享
门口唉提是地铁杀:之前b站被一个游戏demo深深的吸引了。看up主页发现是个初创公司,而且还在招人,也是一天60。二面的时候要我做一个登录验证和传输文件两个微服务,做完要我推到github仓库,还要我加上jaeger和一堆运维工具做性能测试并且面试的时候投屏演示。我傻乎乎的做完以后人家跟我说一句现在暂时不招人,1分钱没拿到全是白干
你的秋招第一场笔试是哪家
点赞 评论 收藏
分享
嵐jlu:我是山川🐔里🐔🧱的,阿里系简历全过; 你这简历一看就还是半成品啊,没有荣誉经历奖项什么的吗?
投递阿里巴巴集团等公司9个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务