C++——构造高度平衡的BST,并按层序输出

来源:互联网 发布:圆形相片制作软件 编辑:程序博客网 时间:2024/06/12 01:07

从键盘读入一行数,放入一个vector,因为是要高度平衡,所以要先进行排序,并且将其构造成一高度平衡的BST,并按层序输出。

#include <iostream>#include <vector>#include <queue>using namespace std;struct TreeNode{//树的结构    int val;    TreeNode *left;    TreeNode *right;    TreeNode(int x) :val(x), left(NULL), right(NULL){}};vector<int> readNumber();TreeNode* sortedArrayToBST(vector<int>& nums);TreeNode* dfs(vector<int>& nums, int left, int right);void printTree(TreeNode *root,int depth);vector<int> readNumber(){//从输入流里读入数据存到一个vector里    cout << "please input numbers (EOF to end):" << endl;    int num;    vector<int> treenum;    while (cin >> num){        treenum.push_back(num);    }    return treenum;}TreeNode* sortedArrayToBST(vector<int>& nums) {//构造高度平衡的二叉排序树    return dfs(nums, 0, nums.size() - 1);//调用函数}TreeNode* dfs(vector<int>& nums, int left, int right){    if (left>right){//如果left比right大,直接返回NULL        return NULL;    }    int mid = (right - left + 1) / 2 + left;//计算中点的索引    TreeNode* root = new TreeNode(nums[mid]);//将中点作为当前的根结点    root->left = dfs(nums, left, mid - 1);//递归调用左子数组和右子数组    root->right = dfs(nums, mid + 1, right);    return root;}void printTree(TreeNode* root){//即是二叉树的层序遍历    queue<TreeNode *> q;//利用队列的先进先出规则,层序从上往下从左往右将结点入队列    TreeNode *ptr = NULL;//用来指向队列的第一个元素    q.push(root);//将根结点入队列     while (!q.empty()){//如果此时队列不为空        ptr = q.front();//ptr指向队列的第一个元素        q.pop();//将队列中第一个结点出队列,因为这里的队列q和ptr存的都是指向树结点的指针        cout << ptr->val << " ";//打印结点            所以在打印前pop打印和pop后打印都无所谓        if (ptr->left != NULL){//如果左结点不为NULL,左结点入队列            q.push(ptr->left);        }        if (ptr->right != NULL){//如果右结点不为NULL,右结点入队列             q.push(ptr->right);        }    }}int main(){    vector<int> nums = readNumber();    sort(nums.begin(), nums.end());    TreeNode* root = sortedArrayToBST(nums);    cout << "The BST is : ";    printTree(root);    cout << endl;    return 0;}

输出结果:
这里写图片描述

0 0
原创粉丝点击