二叉树(Binary
tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分
。
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点
。
树的学习比较依赖递归思想,如果对于递归不是十分了解,建议先掌握递归算法;简单二叉树相关实现如下:
节点定义:
struct Node
{
Node *left; //左子树
Node *right; //右子树
int data; //数据域
};
初始化:
void initRoot(Node **root, int data)
{
if(!*root)
{
*root = new Node;
(*root)->left = nullptr;
(*root)->right = nullptr;
(*root)->data = data;
}
}
前根序遍历:
void preorderTraversal(Node *root)
{
if(root)
{
cout << root->data << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
}
中根序遍历:
void inorderTraversal(Node *root)
{
if(root)
{
inorderTraversal(root->left);
cout << root->data << " ";
inorderTraversal(root->right);
}
}
后根序遍历:
void postorderTraversal(Node *root)
{
if(root)
{
postorderTraversal(root->left);
postorderTraversal(root->right);
cout << root->data << " ";
}
}
层次遍历:
void levelTraversal(Node *root, int level)
{
if(!root)
{
return;
}
if(level == 1)
{
cout << root->data << " ";
}
else if(level > 1)
{
levelTraversal(root->left, level - 1);
levelTraversal(root->right, level - 1);
}
}
插入节点:
bool insert(Node *&root, int data)
{
if (!root)
{
root = new Node;
root->data = data;
root->left = nullptr;
root->right = nullptr;
return true;
}
if(data > root->data)
{
insert(root->right, data);
}
else if(data < root->data)
{
insert(root->left, data);
}
else if(data == root->data)
{
//不允许重复
return false;
}
return true;
}