平衡二叉树的节点搜索函数——Ada应用实例之四

本文介绍了一个平衡二叉树的节点搜索函数,并详细解释了如何修正删除节点功能的一个常见错误。通过调整参数传递方式,确保正确更新父节点指针。

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

 

平衡二叉树的节点搜索函数——Ada应用实例之四

 

以下是一个平衡二叉树的节点搜索函数(:

binarytree *search(binarytree *tree,binarytree *parent,Type data)

{
       binarytree *p = (binarytree *)malloc(sizeof(struct binarytree)*1);
       p = tree;
       bool find = false;
       while(p && !find){
          parent = p;
          if(p->data == data){
            find = true;
            //printf("find %d/n",p->data);
          }
          else if(p->data > data)
             p = p->leftch;
          else
             p = p->rightch;
        }
        return find?p:NULL;
    }

上面程序中把搜索到的节点赋给parent。在另一个删除节点的函数中有如下语句:

    if((p = search(*tree,parent,data)) != NULL){

        if(p->leftch == NULL && p->rightch == NULL){//叶子节点

            if(p->data < parent->data)//左叶子节点

                parent->leftch = NULL;

            else//右叶子节点

                parent->rightch = NULL;

上述代码不能实现删除功能。问题之一是变量parent并没有指向搜索到的节点。这是因为虽然在函数search中把搜索到的节点赋给函数的形参parent,但当调用返回后,外部的实参parent没有得到这个节点。

解决方法是把形参parent定义为“binarytree **parent;”,把“parent = p;”改为“*parent = p;”,把调用语句“search(*tree, parent, data)”改为“search(*tree, &parent, data)”。

如果用Ada编程,那么在编译期间就可发现上述问题。

Ada的过程/函数定义可以对形参指定如下三种模式:

a)      in:该类形参是一个常数,其值由实参决定,在过程/函数中只能对其进行读操作,不能对其进行写操作;

b)      in out:该类形参是一个变量,其初值由实参决定,在过程/函数中既能对其进行读操作,也能对其进行写操作,写操作同时也改变相应实参的值;

c)      out:该类形参是一个没有初值的变量,在过程/函数中既能对其进行读操作,也能对其进行写操作,写操作同时也改变相应实参的值,但读操作必须在写操作之后。

 

以下是一个简单例子:

  procedure Add (A, B: in Integer; C: out Integer) is

  begin

    C := A + B;

  end Add;

假如在上述程序中写一行“A = 1;”,那么编译将报告以下错误:

Assignment to “in” mode parameter not allowed

由此可见,Ada的参数模式可以有效地避免实参与形参相结合时的问题。

 

以下是在C语言中实现查找二叉树结点的函数的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树结构体 typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; // 查找二叉树结点的函数 TreeNode* searchBST(TreeNode* root, int val) { // 如果当前节点为空,说明没有找到,返回NULL if (root == NULL) { return NULL; } // 如果当前节点的值等于要查找的值,返回当前节点 if (root->val == val) { return root; } // 如果当前节点的值大于要查找的值,递归查找左子树 if (root->val > val) { return searchBST(root->left, val); } // 如果当前节点的值小于要查找的值,递归查找右子树 if (root->val < val) { return searchBST(root->right, val); } return NULL; } int main() { // 构造一个二叉树 TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = 4; root->left = (TreeNode*)malloc(sizeof(TreeNode)); root->left->val = 2; root->left->left = (TreeNode*)malloc(sizeof(TreeNode)); root->left->left->val = 1; root->left->left->left = NULL; root->left->left->right = NULL; root->left->right = (TreeNode*)malloc(sizeof(TreeNode)); root->left->right->val = 3; root->left->right->left = NULL; root->left->right->right = NULL; root->right = (TreeNode*)malloc(sizeof(TreeNode)); root->right->val = 7; root->right->left = (TreeNode*)malloc(sizeof(TreeNode)); root->right->left->val = 6; root->right->left->left = NULL; root->right->left->right = NULL; root->right->right = (TreeNode*)malloc(sizeof(TreeNode)); root->right->right->val = 9; root->right->right->left = NULL; root->right->right->right = NULL; // 调用查找函数查找值为3的节点 TreeNode* res = searchBST(root, 3); if (res != NULL) { printf("找到值为%d的节点\n", res->val); } else { printf("没找到\n"); } return 0; } ``` 此代码中,我们首先定义了一个二叉树结构体,并在`searchBST`函数中使用递归的方式进行二叉树的查找,如果当前节点为空,说明没有找到,返回`NULL`;如果当前节点的值等于要查找的值,返回当前节点;如果当前节点的值大于要查找的值,递归查找左子树;如果当前节点的值小于要查找的值,递归查找右子树。最后在`main`函数中构造一个二叉树,并调用查找函数查找值为3的节点
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值