L3-010. 是否完全二叉搜索樹
阿新 • • 發佈:2018-03-29
AI 給定 child class 測試 push_back 層序 輸入格式 遍歷
將一系列給定數字順序插入一個初始為空的二叉搜索樹(定義為左子樹鍵值大,右子樹鍵值小),你需要判斷最後的樹是否一棵完全二叉樹,並且給出其層序遍歷的結果。
輸入格式:
輸入第一行給出一個不超過20的正整數N;第二行給出N個互不相同的正整數,其間以空格分隔。
輸出格式:
將輸入的N個正整數順序插入一個初始為空的二叉搜索樹。在第一行中輸出結果樹的層序遍歷結果,數字間以1個空格分隔,行的首尾不得有多余空格。第二行輸出“YES”,如果該樹是完全二叉樹;否則輸出“NO”。
輸入樣例1:
9 38 45 42 24 58 30 67 12 51
輸出樣例1:
38 45 24 58 42 30 12 67 51 YES
輸入樣例2:
8 38 24 12 45 58 67 42 51
輸出樣例2:
38 45 24 58 42 12 67 51 NO
對節點標號,相鄰標號只有一個孩子的節點或葉子節點和葉子節點至多相差一,但要註意左單枝的情況,最後一個測試點就是左單枝的情況,判斷一下是不是有右孩子但是沒有左孩子即可。
#include<bits/stdc++.h> using namespace std; const int N = 100 + 5; struct node{ int key, floor, lchild, rchild; node(){ floor= lchild = rchild = 0; } } Node[N]; int n, st = 0, root = 0; vector<int> v; void BFS(){ queue<int> Q; Q.push(root); Node[root].floor = 1; int cnt = 0; while(!Q.empty()){ int tmp = Q.front(); Q.pop(); printf("%d%c", Node[tmp].key, (--n ?‘‘:‘\n‘)); if(Node[tmp].lchild != 0){ int x = Node[tmp].lchild; Node[x].floor = Node[tmp].floor + 1; Q.push(x); } if(Node[tmp].rchild != 0){ int x = Node[tmp].rchild; Node[x].floor = Node[tmp].floor + 1; Q.push(x); } if(!Node[tmp].lchild || !Node[tmp].rchild) v.push_back(cnt); if(!Node[tmp].lchild && Node[tmp].rchild) //避免左單枝 v.push_back(100); cnt++; } } void Create(int & root, int key){ if(root == 0) { root = ++st; Node[root].key = key; return; }else if(key > Node[root].key){ Create(Node[root].lchild, key); }else { Create(Node[root].rchild, key); } } int main(){ cin >> n; int key; for(int i = 0; i < n; i++){ cin >> key; Create(root, key); } BFS(); for(int i = v.size() - 1; i > 0; i --){ if(v[i] != v[i-1] + 1){ printf("NO\n"); return 0; } } printf("YES"); }
L3-010. 是否完全二叉搜索樹