二叉搜索树(BFS)总结

本文介绍了二叉搜索树的概念,强调了它是如何保证节点的有序性的。详细讲解了满二叉树和完全二叉树的定义与区别,并概述了在二叉搜索树中插入和删除节点的操作。重点讨论了广度优先遍历(BFS)的算法流程,以及深度优先遍历(DFS)的四种不同遍历方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

满二叉树

定义:高度为h,并且由2{h} –1个结点的二叉树,被称为满二叉树。
这里写图片描述


完全二叉树

定义:一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下一层的叶结点集中在靠左的若干位置上。这样的二叉树称为完全二叉树。
特点:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。显然,一棵满二叉树必定是一棵完全二叉树,而完全二叉树未必是满二叉树。
这里写图片描述


二叉搜索树

定义:在二叉搜索树中,任取一个节点A,A的值不小于它左子树上的任何值、它右子树上的每个值都大于A。
这里写图片描述

插入节点、删除树

/*二叉搜索树数据类型*/
struct TreeNode
{
    int data;
    TreeNode* left;
    TreeNode* right;
};
/*向二叉搜索树中添加一个节点*/
TreeNode* InsertTree(TreeNode* root, int value){//递归调用,所以要记得返回类型
    TreeNode* newNode;
    if(root == nullptr){
        newNode = new TreeNode;
        newNode->data = value;
        newNode->left = nullptr;
        newNode->right = nullptr;
        return newNode;
    }
    if(value < root->data)
        root->left = InsertTree(root->left, value);
    if(value > root->data)
        root->right = InsertTree(root->right, value);
    return root;
}
/*删除二叉树*/
void DeleteTree(TreeNode* root){
    if(root->left != nullptr)
        DeleteTree(root->left);
    if(root->right != nullptr)
        DeleteTree(root->right);
    delete root;
    return;
}

广度优先遍历(BFS)

算法流程:
1. 根节点入队
2. 循环判断当前队列非空,访问队首,出队
3. 如果左子树非空,左子树根节点入队
4. 如果右子树非空,右子树根节点入队
代码:

vector<int> BFS(TreeNode* root){
    std::vector<<int> sequence;
    queue<TreeNode*> q;
    q.push(root);
    while(!q.empty()){
        TreeNode* tmp = q.front();
        sequence.push_back(tmp->data);
        q.pop();
        if(tmp->left != nullptr)
            q.push(tmp->left);
        if(tmp->right != nullptr)
            q.push(tmp->right);
    }
    return sequence;
}

深度优先遍历(DFS)

深度优先遍历。有四种遍历方式:先根,后根,左子树优先,右子树优先

(1)先根顺序遍历:a. 访问根节点 b. 遍历左子树 c. 遍历右子树
(2)后根顺序遍历:a. 遍历左子树 b. 遍历右子树 c. 访问根节点
(3)左子树优先遍历:a. 遍历左子树 b. 访问根节点 c.遍历右子树
(4)右子树优先遍历:a.遍历右子树 b.访问根节点 c.遍历左子树

/*先根遍历代码*/
/*其余遍历方式相似,调换访问顺序即可*/
void FLRTraverse(TreeNode *root){
    printf("%d", root->val); //访问根节点
    if(root->left != NULL)
        FLRTraverse(root->left); //遍历左子树
    if(root->right != NULL)
        FLRTraverse(root->right); //遍历右子树
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值