首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode 222 Count Complete Tree Nodes:利用完全二叉樹性質 O(log²n) 計算節點數

     編輯:關於C++

題目簡介

給定完全二叉樹根節點,求節點總數。完全二叉樹:除最後一層外每層滿,最後一層靠左排列。要求優於 O(n)。

解題思路

完全二叉樹若左右子樹高度相等,則為滿二叉樹,節點數 = 2^h - 1。否則遞歸計算左右子樹節點數 + 1。

  1. 計算左高 leftH(沿左子鏈)和右高 rightH(沿右子鏈)。
  2. 若相等,返回 (1<。
  3. 否則返回 1 + countNodes(root.left) + countNodes(root.right)。

每次遞歸至少一邊是滿樹,可直接計算,深度 O(log n),每層計算高度 O(log n),總時間 O(log² n)。

代碼實現

public int countNodes(TreeNode root) {
    if (root == null) return 0;
    int leftH = 0, rightH = 0;
    TreeNode p = root;
    while (p != null) { leftH++; p = p.left; }
    p = root;
    while (p != null) { rightH++; p = p.right; }
    if (leftH == rightH) return (1 << leftH) - 1;
    return 1 + countNodes(root.left) + countNodes(root.right);
}

複雜度分析

時間 O(log² n),空間 O(log n) 遞歸棧。遠優於 O(n) 遍歷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved