张北北京网站建设最新国际新闻 大事件
题目:
给定一棵完全二叉树的头节点head,返回这棵树的节点个数。如果完全二叉树的节点数为N,请实现时间复杂度低于O(N)的解法。
方法(1):递归O(n)算法
int nodeNum(struct TreeNode* head) {if(NULL == head){return 0;}return 1 + nodeNum(head->left) + nodeNum(head->right); }
方法(2):先计算出二叉树的高度(一直走左路法),如果二叉树的右子树的高度==二叉树高度减1的话,就说明左子树的满二叉树,可以根据公式pow(2,h-1)计算,在模拟递归右子树;否则说明右子树是满二叉树,模拟递归左子树,直到结点为空
/**
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};
*/
class Solution {
public://计算完全二叉树的高度int height(struct TreeNode* head){int count=0;struct TreeNode* cur=head;while(cur)//一直走左边{count++;cur=cur->left;}return count;}int nodeNum(struct TreeNode* head) {//二叉树总高度struct TreeNode* cur=head;int h=height(head);int count=0;while(cur){//右子树高度==总树高度-1,则说明左子树的满二叉树,可以直接算if(height(cur->right)==h-1){count+=pow(2,h-1);//左子树节点数cur=cur->right;//模拟递归的看右子树(将右子树作为新树判断)}else//说明右子树是完全二叉树,可以直接算{count+=pow(2, h-2);cur=cur->left;//模拟递归左子树}h--;//每走一层,高度减一层}return count;}
};