邏輯,判斷當前節點的右子樹的最左下角節點是否到達最後一層,
若到達最後一層,則說明當前節點的左子樹 是一顆,則用公式計算得到總數,然後 對當前節點的右子樹 遞迴求解、
若當前節點的右子樹 的最左下角節點沒到最後一層,則當前 節點的 右子樹是完全二叉樹, 對左子樹遞迴求解。
//當前節點的數,其左子樹到最後一次了沒?
int gethigh(treenode* node, int level)
return level -1;
}int getcbtnum(treenode* head, int level, int total)
if(gethigh(head->right,level+1) == total)else
}int nodenum(treenode* head)
return getcbtnum(head,1,gethigh(head,1));
}
總的**:
#include#include#include#includeusing namespace std;
struct treenode;
//當前節點的數,其左子樹到最後一次了沒?
int gethigh(treenode* node, int level)
return level -1;
}int getcbtnum(treenode* head, int level, int total)
if(gethigh(head->right,level+1) == total)else
}int nodenum(treenode* head)
return getcbtnum(head,1,gethigh(head,1));
}string gettreewithserial(treenode* head)
char c[8];
sprintf(c,"%d",head->value);
string s = c;
s = s+ '_';
string s1 = gettreewithserial(head->left);
string s2 = gettreewithserial(head->right);
return s + s1 + s2;
}treenode* gettree(int arr,int length,int i)else
if((2*i+2)right = gettree(arr, length,2*i+2);
}else
return treenode;
} return nullptr;
}int main();
// int arr = ;
int length = sizeof(arr)/sizeof(arr[0]);
//建樹
treenode* head = gettree(arr, length,0);
//前序檢視建樹是否正確
int num = nodenum(head);
// cout << "str : "
return 0;
}
心中永遠有一顆二叉樹
目錄 二叉樹二叉樹的特點 特殊二叉樹 斜樹 滿二叉樹 完全二叉樹 完全二叉樹的性質 二叉樹測性質 定義 二叉樹 binary tree 是n n 0 個結點的有限集合,該集合或者為空集 稱空二叉樹 或者由乙個結點互不相交的,分別稱為根結點的左子樹和右子樹的二叉樹組成。每個節點最多有兩個結點,也就是說...
判斷一顆二叉樹是不是完全二叉樹
類似於測序遍歷,用佇列實現 先進後出 1 如果根不為空,那麼根入隊 2 判斷佇列是否為空,不為空,則將隊頭元素出隊並儲存在臨時變數cur裡,3 判斷cur是否為空,若不為空,則將cur的左右子樹都放到佇列裡,如果子樹為空,就往佇列裡插入null。若為空,則直接停止出隊,然後看佇列裡是否還有不是nul...
判斷一顆二叉樹是不是完全二叉樹
還有一種特殊的完全二叉樹就是葉子節點都在同一層的,如下圖 完全二叉樹定義,若設二叉樹的深度為h,除第 h 層外,其它各層 1 h 1 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。思路是 用bfs,一層一層的遍歷二叉樹的節點,一但遍歷到空節點,那麼不在往佇列裡加入...