1. 二叉树概念
二叉树是一颗树,其中每个节点都不能有多于2个的子树,一般会有左子树和右子树,两者均可能为空。
二叉树实际上是图。
2. 二叉树节点和类的声明
创建树之前需要先声明一个树的结点。
//声明树结点
typedef struct node {
char element; //结点值
struct node* left; //左子树
struct node* right; //右子树
}TreeNode;
接下来声明一个二叉树类,包括有二叉树的创建和遍历等操作。
class BinTree
{
public:
BinTree();
~BinTree();
void createTree(); //创建二叉树
void preorderBinaryTree();
void inorderBinaryTree();
void postorderBinaryTree();
private:
TreeNode* root;
void insertTreeNode(char ele); //插入树结点
void preorderBinTree(TreeNode *root); //前序遍历树
void inorderBinTree(TreeNode *root); //中序遍历树
void postorderBinTree(TreeNode *root); //后序遍历树
};
3. 创建二叉树的函数实现
insertTreeNode()函数将节点值作为输入,在函数体中先声明一个树节点,申请相应的内存空间,创建出来以后让左右子树为null (让指针初始化的时候指向NULL是一个很好的习惯)。如果树的根节点为空,则将当前树节点作为根节点,否则按照约束条件(左子树 < 父节点 < 右子树)来插入树节点,判断左右子树是否为空,如果为空,则将当前树节点作为左子树或右子树根节点。
void BinTree::createTree() {
int n;
cout << "树中有多少个节点?" << endl;
cin >> n;
cout << "请输入树节点:" << endl;
for (int i = 0; i < n; i++)//输入n个数并创建这个树
{
char ele;
cin >> ele;
insertTreeNode(ele);
}
cout << "二叉树构建完毕!" << endl;
}
void BinTree::insertTreeNode(char ele) {
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->element = ele;
node->left = NULL;
node->right = NULL;
if (root==NULL)//判断树是不是空树
{
root = node;
}
else {//不是空树
TreeNode* temp = root;从树根开始
while (temp!=NULL)
{
if (ele < temp->element)//小于就进左子树
{
if (temp->left==NULL)
{
temp->left = node;
return;
}
else
{
temp = temp->left;
}
}
else//否则就进右子树
{
if (temp->right==NULL)
{
temp->right = node;
return;
}
else
{
temp=temp->right;
}
}
}
}
return;
}
4. 遍历二叉树
(1)前序遍历。前序遍历按照采用递归的方法来遍历二叉树,遵循“根->左->右”的遍历顺序,遍历函数将树的根节点作为输入,递归遍历。
//前序遍历:根左右
void BinTree::preorderBinTree(TreeNode *root) {
if (!root) return;
else {
cout << root->element;
preorderBinTree(root->left);
preorderBinTree(root->right);
}
}
void BinTree::preorderBinaryTree() {
preorderBinTree(root);
cout << endl;
}
(2)中序遍历。中序遍历按照采用递归的方法来遍历二叉树,遵循“左->根->右”的遍历顺序,遍历函数将树的根节点作为输入,递归遍历。
//中序遍历:左根右
void BinTree::inorderBinTree(TreeNode *root) {
if (!root) return;
else {
inorderBinTree(root->left);
cout << root->element;
inorderBinTree(root->right);
}
}
void BinTree::inorderBinaryTree() {
inorderBinTree(root);
cout << endl;
}
(3)后序遍历。后序遍历按照采用递归的方法来遍历二叉树,遵循“左->右->根”的遍历顺序,遍历函数将树的根节点作为输入,递归遍历。
//后序遍历:左右根
void BinTree::postorderBinTree(TreeNode *root) {
if (!root) return;
else {
postorderBinTree(root->left);
postorderBinTree(root->right);
cout << root->element;
}
}
void BinTree::postorderBinaryTree() {
postorderBinTree(root);
cout << endl;
}
5. main()函数实现
int main() {
cout << "创建二叉树:" << endl;
BinTree tree;
tree.createTree();
tree.preorderBinaryTree();//前序遍历
tree.inorderBinaryTree();//前序遍历
tree.postorderBinaryTree();//前序遍历
system("pause");
return 0;
}
6. 案例
构建的二叉树,如图所示:
输入:c b d a
则,运行结果如下图所示:
7. 总结
(1) 在VS项目中,类的定义和成员函数实现分离的时候,除了包含.h文件外,还要将所有函数的实现均放在.cpp文件中,包括构造函数和析构函数。
(2) 在此实现二叉树的小项目练习过程中,自己重温了C++的语法和部分数据结构算法,温故而知新。
(3) 其他,参考博客:https://blog.csdn.net/qq_42011541/article/details/80547098