LeetCode Count Complete Tree Nodes,leetcodenodes
LeetCode Count Complete Tree Nodes題目
思路
這個樹會灰常的大;
先沿著左右兩遍計算深度,如果深度一樣直接代公式算;
如果深度不一樣,那就找最下面一層的斷點;
代碼
int maxD, num;int calDeepFromRight(struct TreeNode* root) { int ans = 0; while (root) { ans++; root = root->right; } return ans;}int calDeepFromLeft(struct TreeNode* root) { int ans = 0; while (root) { ans++; root = root->left; } return ans;}void findBreakPoint(struct TreeNode* root, int pos, int deep) { if (num != -1) return; if (root == NULL && deep == maxD) { num = 1; int base = 1; for (int i = 1; i < deep - 1; i++) num += (base *= 2); num += pos; return; } else { if (root == NULL) return; findBreakPoint(root->left, pos * 2, deep + 1); findBreakPoint(root->right, pos * 2 + 1, deep + 1); }}int countNodes(struct TreeNode* root) { int ld = calDeepFromLeft(root), rd = calDeepFromRight(root); maxD = ld; if (ld == rd) { if (ld == 0) return 0; int base = 1; num = 1; for (int i = 1; i < ld; i++) num += (base *= 2); } else { num = -1; findBreakPoint(root, 0, 1); } return num;}