L3-1 是否完全二叉搜索树 (30分)

将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。

输入格式:
输入第一行给出一个不超过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;
 
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int v,TreeNode* l=NULL,TreeNode* r=NULL) :val(v),left(l),right(r) {}
};
 
void insert(int v,TreeNode*& root) {
    if (root==NULL) {
        root=new TreeNode(v);
        return;
    }
    TreeNode* y;
    TreeNode* x=root;
    while (x!=NULL) {
        y=x;
        if (v>x->val) {
            x=x->left;
        }
        else {
            x=x->right;
        }
    }
    if (v>y->val) {
        y->left=new TreeNode(v);
    }
    else {
        y->right=new TreeNode(v);
    }
}
 
void bfs(TreeNode* root) {
    queue<TreeNode*> q;
    if (root) {
        q.push(root);
    }
    int print=0;
    while (!q.empty()) {
        TreeNode* rt=q.front();
        q.pop();
        if (!print) {
            print=1;
        }
        else {
            putchar(' ');
        }
        printf("%d",rt->val);
        if (rt->left) {
            q.push(rt->left);
        }
        if (rt->right) {
            q.push(rt->right);
        }
    }
    putchar('\n');
}
 
int judge(TreeNode* root) {
    TreeNode* p;
    queue<TreeNode*> q;
    q.push(root);
    while ((p=q.front())!=NULL) {
        q.push(p->left);
        q.push(p->right);
        q.pop();
    }
    while (!q.empty()) {
        if (q.front()) {
            return 0;
        }
        q.pop();
    }
    return 1;
}
 
int main()
{
    int n,val;
    TreeNode* root=NULL;
    scanf("%d",&n);
    for (int i=0;i<n;i++) {
        scanf("%d",&val);
        insert(val,root);
    }
    bfs(root);
    printf("%s\n",judge(root)?"YES":"NO");
	return 0;
}
 

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页