網上看了很多人的答案,都說最優解是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,一層一層的遍歷二叉樹的節點,一但遍歷到空節點,那麼不在往佇列裡加入...