程序填空-利用读入的整数构造一棵二叉排列树并给定多次查询

 

仅私用 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是实现二叉排序树删除结点程序的完整代码,包含了详细的注释: ```c++ #include <iostream> using namespace std; typedef struct ElemType { int key; } ElemType; typedef struct BSTNode { ElemType data; BSTNode* lchild, * rchild; } BSTNode, * BSTree; int flag = 1; // 插入节点 void InsertBST(BSTree& T, ElemType e); // 创建二叉排序树 void CreateBST(BSTree& T); // 中序遍历 void InOrderTraverse(BSTree T); // 删除节点 void DeleteBST(BSTree& T, char key); int main() { BSTree T; CreateBST(T); int key; cin >> key; DeleteBST(T, key); InOrderTraverse(T); } void InsertBST(BSTree& T, ElemType e) { if (!T) { T = new BSTNode; T->data = e; T->lchild = T->rchild = NULL; return; } if (e.key == T->data.key) { flag = 0; return; } else if (e.key < T->data.key) { InsertBST(T->lchild, e); } else { InsertBST(T->rchild, e); } } void CreateBST(BSTree& T) { T = NULL; int n; cin >> n; ElemType e; for (int i = 0; i < n; i++) { cin >> e.key; flag = 1; InsertBST(T, e); } } void InOrderTraverse(BSTree T) { if (T) { InOrderTraverse(T->lchild); cout << T->data.key << " "; InOrderTraverse(T->rchild); } } void DeleteBST(BSTree& T, char key) { if (!T) { // 未找到节点 return; } if (T->data.key == key) { // 找到待删除节点 BSTree p = T; // 待删除节点左右子树都不为空 if (T->lchild && T->rchild) { BSTree q = T->lchild; while (q->rchild) { q = q->rchild; } T->data = q->data; DeleteBST(T->lchild, q->data.key); } else { // 待删除节点左右子树至少有一个为空 if (!T->lchild) { // 只有右子树 T = T->rchild; } else if (!T->rchild) { // 只有左子树 T = T->lchild; } delete p; } } else if (T->data.key > key) { // 在左子树中查找 DeleteBST(T->lchild, key); } else { // 在右子树中查找 DeleteBST(T->rchild, key); } } ``` 在DeleteBST函数中,首先判断当前节点是否为待删除节点,如果是,则分情况处理: 1. 待删除节点左右子树都不为空:找到待删除节点左子树中最大的节点,用其代替待删除节点,然后删除该节点。 2. 待删除节点左右子树至少有一个为空:将待删除节点的父节点指向待删除节点的非空子树,然后删除待删除节点。 如果当前节点不是待删除节点,则根据二叉排序树的性质在左右子树中查找待删除节点,直到找到待删除节点或者遍历完整个二叉排序树为止。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值