zoukankan      html  css  js  c++  java
  • L3-010. 是否完全二叉搜索树

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

    输入格式:

    输入第一行给出一个不超过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 <iostream>
    #include <cstdlib>
    #include <cmath>
    #include <queue>
    using namespace std;
    struct tree
    {
        int data;
        tree *l,*r;
        tree()
        {
            l = r = NULL;
        }
    }*root;
    void level()
    {
        int flag = 1,c = 0,e = 0;
        queue<tree *>q;
        if(root)q.push(root);
        while(!q.empty())
        {
            int d = 0;
            if(q.front() -> l)q.push(q.front() -> l),d ++;
            if(q.front() -> r)
            {
                q.push(q.front() -> r);
                if(!d)flag = 0;
                else d ++;
            }
            if(c && d > e)flag = 0;
            e = d;
            if(c)cout<<' '<<q.front() -> data;
            else
            {
                c = 1;
                cout<<q.front() -> data;
            }
            q.pop();
        }
        cout<<endl;
        if(flag)cout<<"YES";
        else cout<<"NO";
    }
    tree *insert_(tree *node,int d)
    {
        if(node == NULL)
        {
            node = new tree();
            node -> data = d;
        }
        else if(d > node -> data)node -> l = insert_(node -> l,d);
        else node -> r = insert_(node -> r,d);
        return node;
    }
    int main()
    {
        int n,d;
        cin>>n;
        root = NULL;
        for(int i = 0;i < n;i ++)
        {
            cin>>d;
            root = insert_(root,d);
        }
        level();
        return 0;
    }
  • 相关阅读:
    Symmetric Order
    Red and Black
    Sticks(递归经典)
    Pascal Library
    cantor的数表
    OJ 调试技巧:VS2010 中 通过设置编译参数定义宏,无需修改源文件重定向标准输入输出
    strcmp
    最短周期串
    字母重排
    codeblocks 单步调试
  • 原文地址:https://www.cnblogs.com/8023spz/p/8641280.html
Copyright © 2011-2022 走看看