C++中构造函数的基本应用

64 阅读3分钟

题目描述

描述

输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。

输入描述:

输入第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。

输出描述:

可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。 每种遍历结果输出一行。每行最后一个数据之后有一个换行。 输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。

示例
输入
5
1 6 5 9 8
输出
1 6 5 9 8 
1 5 6 8 9 
5 8 9 6 1 

题目解答

题目分析

代码中定义了一个结构体 TreeNode,用于表示二叉排序树的节点。二叉排序树是一种特殊的二叉树,它满足以下性质:

  1. 对于树中的每个节点,它的左子树中的所有节点的值都小于该节点的值。
  2. 对于树中的每个节点,它的右子树中的所有节点的值都大于该节点的值。
  3. 左右子树都是二叉排序树。

TreeNode 结构体的成员如下所示:

struct TreeNode {
    int data;           // 存储节点的数据值
    TreeNode* leftchild; // 指向左子树的指针
    TreeNode* rightchild;// 指向右子树的指针

    TreeNode(int x)     // 构造函数,用于初始化节点的数据值和子树指针
        : data(x), leftchild(NULL), rightchild(NULL) {}
};
  1. int data;:存储节点的数据值。
  2. TreeNode* leftchild;:是指向左子树的指针。
  3. TreeNode* rightchild;:是指向右子树的指针。
  4. TreeNode(int x):一个构造函数,用于创建 TreeNode 类型的对象。构造函数接受一个整数参数 x,并将其赋值给节点的数据值 data。同时,左右子树的指针被初始化为 NULL,表示新创建的节点暂时没有左右子树。

在 C++ 中,构造函数的主要目的是在对象被创建时对其进行初始化。构造函数可以带有参数,也可以没有参数。当没有参数时,可以用一对空的大括号 {} 表示。

在本题的代码中,构造函数的定义如下:

cppCopy code
TreeNode(int x): data(x), leftchild(NULL), rightchild(NULL) {}

这里,data(x)leftchild(NULL)rightchild(NULL) 是成员初始化列表,用于给成员变量赋初值。而最后的一对大括号 {} 表示构造函数体,即在对象被创建时要执行的具体操作。

如果构造函数没有其他需要执行的操作,那么这一对空的大括号可以省略。

题解

#include <bits/stdc++.h>
using namespace std;

// 二叉排序树
struct TreeNode {
    int data;
    TreeNode *leftchild;
    TreeNode *rightchild;
    TreeNode(int x) : data(x), leftchild(NULL), rightchild(NULL) {}
};

void visit(TreeNode *t) {
    cout << t->data << " ";
}

void PreOrder(TreeNode *root) {
    if (root == NULL) {
        return;
    }
    visit(root);
    PreOrder(root->leftchild);
    PreOrder(root->rightchild);
}

void InOrder(TreeNode *root)
{
    if (root == NULL) {
        return;
    }
    InOrder(root->leftchild);
    visit(root);
    InOrder(root->rightchild);
    return;
}

void PostOrder(TreeNode *root)
{
    if (root == NULL) {
        return;
    }
    PostOrder(root->leftchild);
    PostOrder(root->rightchild);
    visit(root);
    return;
}

TreeNode *Insert(TreeNode *root, int x) {
    if (root == NULL) {
        root = new TreeNode(x);
    }
    if (x == root->data)
        ;
    else if (x < root->data)
        root->leftchild = Insert(root->leftchild, x);
    else
        root->rightchild = Insert(root->rightchild, x);
    return root;
}

int main() {
    int n;
    // cin 的输入运算符 >> 返回一个值,该值在成功读取输入时为真,否则为假。
    while (cin >> n) {
        TreeNode *root = NULL;
        while (n--) {
            int x;
            cin >> x;
            root = Insert(root, x);
        }
        PreOrder(root);
        cout << endl;
        InOrder(root);
        cout << endl;
        PostOrder(root);
        cout << endl;
    }
    return 0;
}