一顆完全二叉樹,求其結點個數

2021-06-17 18:31:28 字數 1127 閱讀 5008

網上看了很多人的答案,都說最優解是o(n),想到了一種更快的演算法,複雜度是o(lgn的平方),就是對左右子樹進行二分,找最後一層的最右邊那個結點即可:

#include #include #include using namespace std;

struct node

if (right)

}};int getdepth(node* root)

return depth;

}void getmostrightdepthandindex(node* root, int* depth, int* index) else if (root->left) else

}}void getmostleftdepthandindex(node* root, int* depth, int* index)

else if (root->left) else

}}void getnodenum(node* root, int cur_depth, int cur_index,

int* node_num, int max_depth)

*node_num += cur_index;

return;

} int ml_depth = root->left ? cur_depth + 1 : cur_depth;

int ml_index = (cur_index - 1) * 2 + 1;

int mr_depth = root->right ? cur_depth + 1 : cur_depth;

int mr_index = (cur_index - 1) * 2 + 2;

getmostrightdepthandindex(root->left, &ml_depth, &ml_index);

getmostleftdepthandindex(root->right, &mr_depth, &mr_index);

if (ml_depth == mr_depth) else if (ml_depth < max_depth) else

} else if (ml_depth > mr_depth)

} else

}int main()

222 完全二叉樹的結點個數

完全二叉樹和滿二叉樹的區別 如果二叉樹中除去最後一層節點為滿二叉樹,且最後一層的結點依次從左到右分布,則此二叉樹被稱為完全二叉樹。由於題中已經告訴我們這是一顆完全二叉樹,我們又已知了完全二叉樹除了最後一層,其他層都是滿的,並且最後一層的節點全部靠向了左邊。那我們可以想到,可以將該完全二叉樹可以分割成...

判斷一顆二叉樹是不是完全二叉樹

類似於測序遍歷,用佇列實現 先進後出 1 如果根不為空,那麼根入隊 2 判斷佇列是否為空,不為空,則將隊頭元素出隊並儲存在臨時變數cur裡,3 判斷cur是否為空,若不為空,則將cur的左右子樹都放到佇列裡,如果子樹為空,就往佇列裡插入null。若為空,則直接停止出隊,然後看佇列裡是否還有不是nul...

判斷一顆二叉樹是不是完全二叉樹

還有一種特殊的完全二叉樹就是葉子節點都在同一層的,如下圖 完全二叉樹定義,若設二叉樹的深度為h,除第 h 層外,其它各層 1 h 1 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。思路是 用bfs,一層一層的遍歷二叉樹的節點,一但遍歷到空節點,那麼不在往佇列裡加入...