数据结构之二叉查找树

数据结构之二叉树学习


二叉树的特性:

二叉树成为二叉查找树的性质是,对于树种的每个节点X,他的左子树中的所有关键字的值均小于X的关键字的值,而他的右子树中的所有关键字的值均大于X的关键字的值。这意味着,该树的所有元素均可以是用某种统一的方式排序。
tree.h

#pragma once
//we define the binary tree.
struct treeNode;
typedef struct treeNode * Tree;
struct treeNode
{
    int elem;
    Tree left;
    Tree right;
};
Tree treeCreat(int val);
Tree treeInsert(Tree tr, int val);
Tree treeDelete(Tree tr, int val);
Tree treeFind(Tree tr, int val);
Tree treeFindMax(Tree tr);
Tree treeFindMin(Tree tr);

tree.c

#include "stdafx.h"
#include "tree.h"

#include <stdlib.h>
#include <iostream>
using namespace std;
Tree treeCreat(int val)
{
    Tree tr = (Tree)malloc(sizeof(struct treeNode));
    tr->elem = val;
    tr->left = NULL;
    tr->right = NULL;
    return tr;
}

Tree treeInsert(Tree tr, int val)
{
    if (tr == NULL)
    {
        tr =treeCreat(val);

    }
    else if (val < tr->elem)
        tr->left = treeInsert(tr->left, val);
    else if (val > tr->elem)
        tr->right = treeInsert(tr->right, val);
    return tr;
}
Tree treeDelete(Tree tr, int val)  //二叉树种非常关键的一个函数,
{
    Tree temp;
    if (tr == NULL)
    {
        cout << "cann't find the elements" << endl;
    }
    else if (val < tr->elem)
    {
        tr = treeDelete(tr->left, val);
    }
    else if (val > tr->elem)
    {
        tr = treeDelete(tr->right, val);
    }
    if (tr->left && tr->right)   //如果tr又两个孩子,
    {

        temp = treeFindMin(tr->right);
        tr->elem = temp->elem;
        tr = treeDelete(tr->right, tr->elem);  //将删除temp的机会留到最后
    }
    else
    {
        temp = tr;    //这里没有用到temp,
        if (tr->left == NULL)
            tr = tr->right;
        else if (tr->right == NULL)
            tr = tr->left;
        free(temp); // 调用free函数的任务放在这里。
    }
    return tr;
}
Tree treeFind(Tree tr, int val)
{
    if (tr == NULL)
        return NULL;
    else if (val < tr->elem)
        treeFind(tr->left, val);
    else if (val > tr->elem)
        treeFind(tr->right, val);
    else
        return tr;
}
Tree treeFindMax(Tree tr)
{
    if (tr == NULL)
        return NULL;
    if (tr->right != NULL)
    {
        treeFindMax(tr->right);
    }
    return tr;
}
Tree treeFindMin(Tree tr)
{
    if (tr == NULL)
        return NULL;
    if (tr->left != NULL)
    {
        treeFindMin(tr);
    }
    return tr;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值