一、二叉排序树
二叉排序树也称二叉查找树,是学习数据结构树的第一步,其主要性质如下:
(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树
(4)无等值节点
对二叉排序树的操作包括:
1.树的创建(节点插入)
2.树的遍历(前序,中序,后序)
3.树中节点的删除
树的结构体为:
struct Tree
{
int val;
Tree *left;
Tree *right;
Tree(int x) : val(x), left(NULL), right(NULL)
{
}
};
树的建立和插入的代码:
void insert(int val, Tree *root) //val为要插入的节点权值,root为根节点指针
{
if (val == root->val){ return; }
if (val < root->val&&root->left == NULL){
root->left = new Tree(val);
}
if (val < root->val&&root->left != NULL){
insert(val, root->left);
}
if (val>root->val&&root->right == NULL){
root->right = new Tree(val);
}
if (val>root->val&&root->right != NULL){
insert(val, root->right);
}
}
先序,中序,后序遍历的函数为:
void xianxu(Tree *root)
{
cout << root->val << " ";
if (root->left != NULL)
{
xianxu(root->left);
}
if (root->right != NULL)
{
xianxu(root->right);
}
}
void zhongxu(Tree *root)
{
if (root->left)
{
zhongxu(root->left);
}
cout << root->val << " ";
if (root->right)
{
zhongxu(root->right);
}
}
void houxu(Tree *root)
{
if (root->left)
{
houxu(root->left);
}
if (root->right)
{
houxu(root->right);
}
cout << root->val << " ";
}
二叉树的节点删除要分情况讨论
情况一:
要删除的节点为叶子结点无左子树和右子树
操作:
直接删去该节点
情况二:
要删除的节点只有一个子树(左子树或者右子树)
操作:
将父节点指向删除节点的指针指向那个单一的子树
情况三:
要删除的节点有两个子树(左子树和右子树)
操作:
遍历删除节点的左子树(或者右子树),找到最大的左子树节点(或者最小的右子树节点),改为递归删除该节点(左最小或者右最大)并将该节点的val赋值给删除的节点。