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

    题解

    判断一棵树是否是完全二叉树:

    取队列的头,将头的左右孩子入队,循环每次判断是否为空,如果为空节点,此时退出循环。

    然后检查队列中的元素是否全部为空,如果是则说明是完全二叉树,否则不是。

    代码

    #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('
    ');
    }
    
    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
    ",judge(root)?"YES":"NO");
    	return 0;
    }
    
    
  • 相关阅读:
    01、u-boot 打补丁 编译 烧写
    3、JZ2440 按键驱动(中断)
    2、JZ2440 按键驱动(查询)
    1、JZ2440 LED驱动
    004、栈的基本操作
    003、动态顺序表的插入与删除
    002、静态顺序表的插入与删除
    对百度的评价
    关于找水王的思路
    软件市场应用前景
  • 原文地址:https://www.cnblogs.com/xyqxyq/p/12323903.html
Copyright © 2011-2022 走看看