数据结构之树的应用梳理(一)二叉排序树

来源:互联网 发布:淘宝系统架构 编辑:程序博客网 时间:2024/06/07 18:31

一、二叉排序树


二叉排序树也称二叉查找树,是学习数据结构树的第一步,其主要性质如下:
(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赋值给删除的节点。

阅读全文
0 0