zoukankan      html  css  js  c++  java
  • C语言——二叉排序树

    二叉排序树是一种实现动态查找的树表,又称二叉查找树

    二叉排序树的性质:

    1. 若它的左子树不为空,则左子树上所有节点的键值均小于它的根节点键值

    2. 若它的右子树不为空,则右子树上所有节点的键值均大于它的根节点键值

    3. 根的左右子树也分别为二叉排序树

    #include <stdio.h>
    #include "BinTree.h"
    
    // 二叉排序树的查找算法
    
    /*
    // 二叉链表的类型定义
    typedef struct btnode
    {
        int key;
        struct btnode *lchild, *rchild; // 指向左右孩子的指针
    }*BinTree;
    
    // 三叉链表的类型定义
    typedef struct ttnode
    {
        int data;
        struct ttnode *lchild, *parent, *rchild;
    }*TBinTree;
    */
    
    /*
    在根指针所指的二叉排序树上递归地查找键值等于key的节点。
    若成功,则返回指向该节点的指针,否则返回空指针。
    */
    BinTree SearchBST(BinTree bst, int key)
    {
        if(bst == NULL) return NULL;
        else if(key == bst->key) return bst;
        else if(key < bst->key) return SearchBST(bst->lchild, key);
        else return SearchBST(bst->rchild, key);
    }

    二叉排序树插入节点

    #include <stdio.h>
    #include "BinTree.h"
    
    // 二叉排序树的查找算法
    
    /*
    // 二叉链表的类型定义
    typedef struct btnode
    {
        int key;
        struct btnode *lchild, *rchild; // 指向左右孩子的指针
    }*BinTree, BSTNode;
    */
    
    // 二叉排序树的节点插入方法
    /*
    在二叉排序树上进行插入的原则是:必须要保证插入一个新节点后,仍为一棵
    二叉排序树。这个节点是查找不成功时查找路径上访问的最后一个节点的左孩子
    或右孩子。
    */
    
    /*
    在根指针所指的二叉排序树上递归地查找键值等于key的节点。
    若成功,则返回指向该节点的指针,否则返回空指针。
    指针f为查找节点的双亲,初始值为NULL
    */
    BinTree SearchBST(BinTree bst, int key, BSTNode *f)
    {
        if(bst == NULL) return NULL;
        else if(key == bst->key) return bst;
        else if(key < bst->key) return SearchBST(bst->lchild, key, bst);
        else return SearchBST(bst->rchild, key, bst);
    }
    
    // 若根指针bst所指的二叉排序树上无键值为key的节点,
    // 则插入这个节点,并返回1,否则返回0.
    int InsertBST(BinTree bst, int key)
    {
        BSTNode *p, *t, *f;
        f = NULL;
        t = SearchBST(bst, key, f);
    
        // 查找不成功时插入新节点
        if(t==NULL)
        {
            p = malloc(sizeof(btnode));
            p->key = key;
            p->lchild = NULL;
            p->rchild = NULL;
            // 如果查找节点的双亲不存在,被插入节点为新的根节点
            if(f == NULL) bst = p;
            else if(key < f->key) f->lchild = p;
            else f->rchild = p;
    
            return 1;
        }
        else // 查找成功时不用插入
            return 0;
    }
  • 相关阅读:
    Outline of the research(updated 8th,Aug)
    Similarity metrics(Updated Aug,8th)
    Experiments on the NYC dataset(updated 7th,Aug)
    Fused Matrix Factorization & some personal thoughts (Updated 1st,Aug,afternoon)
    Java——图片读取与存储
    Java——setBounds的用法以及居中的方式
    linux 常用命令整理----解压缩
    周一01.4安装PyCharm步骤
    周一01.2 计算机硬件&操作系统
    周一01.3Python多版本共存&pip环境变量设置
  • 原文地址:https://www.cnblogs.com/lqcdsns/p/7465985.html
Copyright © 2011-2022 走看看