1115 Counting Nodes in a BST (30 分)

PAT115
点击阅读题目
这个题目我要反省反省,以为自己会bst,就没认真看题干,写bst构造的时候把条件写错了写成了小于根的放在右边,明明题目都说了左边不超过或者与根相等,我还是写错了,以前也没有注意这个,可能以前学的时候知识是热乎的,自己写对写错也忘记了,时间一久,一些细节就暴露了,本来很快就能过的题目,我硬是找不出错误在哪里,原来就是哪里少了一个等于号,白白的浪费这么多时间,习惯了,我本来就粗心大意,这是我需要改进的地方,以后一定要仔细审题。

BFS 是递归定义的, 根的值大于等于左孩子的值, 小于右孩子的值,然后左右孩子为根的时候也是如此。

题意,给出一个序列,要求按顺序构造一棵BTS树,题目说树开始时空树.
然后要求求出最后一层的结点数,还有倒数第二层的结点数。 可以用dfs或者bfs都可以,dfs代码比bfs少很多。

思路,用一个数组记录所有层数的结点数,再用一个变量记录最深的层数,然后取后面2层就可以了
题目要求的输入是 最后一层的结点数 + 倒数第二层结点数 = 两层的结点总数

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 3001;
struct node {
    int data, layer;
    node *lchild, *rchild;
};
int level[N], max_level = 0;

node* newNode(int x) {
    node* Node = new node;
    Node->lchild = Node->rchild = NULL;
    Node->data = x;
    return Node;
}

void insert(node* &root, int x) {
    if(root == NULL) {
        root = newNode(x);
        return ;
    } else if(x <= root->data) { // <= 的放左边
        insert(root->lchild, x);
    } else {
        insert(root->rchild, x);
    }
}

node* create(int data[], int n) {
    node* root = NULL;
    for(int i = 0; i < n; i++) {
        insert(root, data[i]);
    }
    return root;
}

void BFS(node* root) { //宽搜
    queue<node*> q;
    root->layer = 1;
    q.push(root);
    while(!q.empty()) {
        node* now = q.front();
        q.pop();
        level[now->layer]++;
        max_level = max(max_level, now->layer); 
        if(now->lchild != NULL) {
            now->lchild->layer = now->layer + 1;
            q.push(now->lchild);
        }
        if(now->rchild != NULL) {
            now->rchild->layer = now->layer + 1;
            q.push(now->rchild);
        }
    }
}

// void dfs(node* root, int deep) { //深搜
//     if(root == NULL) return ;
//     max_level = max(deep, max_level);
//     level[deep]++;
//     dfs(root->lchild, deep+1);
//     dfs(root->rchild,deep+1);
// }


int main() {
    int a[N];
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    node *root = create(a, n); //建树
    BFS(root);//算每层的结点数 //宽搜
   // dfs(root, 1);          //深搜
    printf("%d + %d = %d\n", level[max_level], level[max_level - 1], level[max_level] + level[max_level - 1]);
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值