1. 程式人生 > >L3-010. 是否完全二叉搜索樹

L3-010. 是否完全二叉搜索樹

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. 是否完全二叉搜索樹