在二叉树中查找K值

  • 思想:

        (1)根节点为该值,说明找到了,返回该结点。

        (2)未找到,在左子树中递归查找,找到返回结点

        (3)左子树查找结果为空,则在右子树中递归查找。

  • 代码:

        1.返回K值所在节点

//在二叉树中查找某值的结点
Node* Find(Node* root, char k)
{
    Node* p = NULL;
    if (root == NULL)
        return NULL;
    if (root->value == k)
        return root;
    p = Find(root->left, k);
    if (p != NULL)
        return p;
    /*这两行代码很重要,必须要有,递归的结果只返回到了p内,
    还没返回到main函数内,因此需要再ruturn一次*/
    return Find(root->right, k);
}

        2.返回k值的双亲结点:


//在二叉树中查找某值的结点
Node* FindParent(Node* root, char k)
{
    Node* p = NULL;
    if (root == NULL)
        return NULL;
    //如果有左/右孩子,并且孩子的值等于k,返回根节点
    if (root->left!=NULL&&root->left->value == k||
        root->right != NULL && root->right->value == k)
        return root;
    //不然,左孩子进行递归查找
    p = FindParent(root->left, k);
    //在左孩子中找到,返回该节点,未找到右孩子继续查找
    if (p != NULL)
        return p;
    return FindParent(root->right, k);
}
  • 完整代码:
typedef struct node
{
    char value;//当前节点值
    struct node* left;//指向当前节点左孩子指针
    struct node* right;//指向当前节点右孩子指针
}Node;

typedef struct tree
{
    Node* root;
}Tree;

void InitTree(Tree* t)
{
    t->root = NULL;
}

//先序遍历创建二叉树
Node* Create(const char*& str) //因为要修改字符串就加了引用&
{
    if (*str == '*')
        return NULL;
    else
    {
        Node* newnode = (Node*)malloc(sizeof(Node));
        if (newnode != NULL)
        {
            newnode->value = *str;
            newnode->left = Create(++str);
            newnode->right = Create(++str);
            return newnode;
        }
    }
}

//在二叉树中查找K值的结点,返回K所在结点
Node* Find(Node* root, char k)
{
    Node* p = NULL;
    if (root == NULL)
        return NULL;
    if (root->value == k)
        return root;
    p = Find(root->left, k);
    if (p != NULL)
        return p;
    return Find(root->right, k);
}

//在二叉树中查找K值,返回K值的双亲的结点
Node* FindParent(Node* root, char k)
{
    Node* p = NULL;
    if (root == NULL)
        return NULL;
    //如果有左/右孩子,并且孩子的值等于k,返回根节点
    if (root->left!=NULL&&root->left->value == k||
        root->right != NULL && root->right->value == k)
        return root;
    //不然,左孩子进行递归查找
    p = FindParent(root->left, k);
    //在左孩子中找到,返回该节点,未找到右孩子继续查找
    if (p != NULL)
        return p;
    return FindParent(root->right, k);
}

int main()
{
    Tree t;
    InitTree(&t);
    const char* str = "ABDG**HI****CE*J**F**";
    t.root = Create(str);
    Node* p = Find(t.root, 'B');
    //Node* p = Find(t.root, 'Z');
    //Node* p = FindParent(t.root, 'B');
    if (p != NULL)
        printf("找到了!,p=%d", p->value);
    else
        printf("未找到!");
}

 注:创建的二叉树如下图所示,创建思路:创建二叉树

  • 运行结果:

        1.返回K值所在节点:

        2.返回k值双亲结点 

         3.未找到的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值