PAT(Advanced)1115 Counting Nodes in a BST 先序遍历 C++实现

PAT(Advanced)甲级1115 Counting Nodes in a BST 先序遍历 C++实现

题目链接

1115 Counting Nodes in a BST

题目大意

给定一个序列,建立二叉搜索树,根据题目给出二叉排序树定义,在二叉搜索树中的的任一节点其左子树的所有节点关键字小于等于该节点关键字,其左子树的所有节点关键字大于该节点关键字,其左右子树也必须是一棵二叉搜索树,可以存在关键字相同的节点

算法思路

根据题意,先建立二叉搜索树

BST::BST(vector<int>& sequence) {
    root = NULL;
    level.resize(sequence.size());
    for (vector<int>::iterator it = sequence.begin(); it != sequence.end(); it++) {
        insert(root, *it);
    }
    depth = 0;
    preOrderTraverse(root, 0);
}

void BST::insert(Node* &p, int value) {
	// 第一个参数为指针的引用,改变当前结点父亲节点(若有)的对应子树指针,方便插入
    if (p == NULL) {
    	// 找到空节点
        p = new Node(value);
        return;
    }
    // 若小于等于当前结点关键字则到左子树中递归查找位置,否则在右子树中查找
    insert((p->data >= value ? p->left : p->right), value);
}

先序遍历,递归地计算每一层有多少结点,存入level数组

void BST::preOrderTraverse(Node *p, int currentLevel) {
    if (p == NULL) {
        return;
    }
    depth = max(depth, currentLevel);
    level[currentLevel]++;
    preOrderTraverse(p->left, currentLevel + 1);
    preOrderTraverse(p->right, currentLevel + 1);
}

AC代码

/*
author : eclipse
email  : [email protected]
time   : Sun Jun 28 20:30:05 2020
*/
#include <bits/stdc++.h>
using namespace std;

struct Node {
    int data;
    Node *left;
    Node *right;
    Node(int value) : data(value), left(NULL), right(NULL) {}
};

class BST {
private:
    Node *root;
    vector<int> level;
    int depth;
    void insert(Node* &p, int value);
    void preOrderTraverse(Node *p, int currentLevel);
public:
    BST(vector<int>& sequence);
    void print();
};

BST::BST(vector<int>& sequence) {
    root = NULL;
    level.resize(sequence.size());
    for (vector<int>::iterator it = sequence.begin(); it != sequence.end(); it++) {
        insert(root, *it);
    }
    depth = 0;
    preOrderTraverse(root, 0);
}

void BST::insert(Node* &p, int value) {
    if (p == NULL) {
        p = new Node(value);
        return;
    }
    insert((p->data >= value ? p->left : p->right), value);
}

void BST::preOrderTraverse(Node *p, int currentLevel) {
    if (p == NULL) {
        return;
    }
    depth = max(depth, currentLevel);
    level[currentLevel]++;
    preOrderTraverse(p->left, currentLevel + 1);
    preOrderTraverse(p->right, currentLevel + 1);
}

void BST::print() {
    printf("%d + %d = %d", level[depth], level[depth - 1], level[depth] + level[depth - 1]);
}

int main(int argc, char const *argv[]) {
    int N;
    scanf("%d", &N);
    vector<int> sequence;
    sequence.resize(N);
    for (int i = 0; i < sequence.size(); i++) {
        scanf("%d", &sequence[i]);
    }
    BST *bst = new BST(sequence);
    bst->print();
    return 0;
}

样例输入

9
25 30 42 16 20 20 35 -5 28

样例输出

2 + 4 = 6

鸣谢

PAT

最后

  • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章