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;
    }
  • 相关阅读:
    for循环
    while循环语句的几种方式
    IF....Else循环
    Python——文件读取
    数据结构之二叉树
    JAVA的免费天气api接口调用示例
    JAVA API
    JAVA爬虫代码
    普通网页怎么改成响应式布局
    循环遍历二叉树
  • 原文地址:https://www.cnblogs.com/lqcdsns/p/7465985.html
Copyright © 2011-2022 走看看