C語言——二叉排序樹

二叉排序樹是一種實現動態查找的樹表,又稱二叉查找樹node

二叉排序樹的性質:算法

1. 若它的左子樹不爲空,則左子樹上全部節點的鍵值均小於它的根節點鍵值spa

2. 若它的右子樹不爲空,則右子樹上全部節點的鍵值均大於它的根節點鍵值指針

3. 根的左右子樹也分別爲二叉排序樹code

 

#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);
}

 

二叉排序樹插入節點blog

#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;
}
相關文章
相關標籤/搜索