生活随笔
收集整理的這篇文章主要介紹了
数据结构-二叉排序树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:
(1)若左子樹不空,則左子樹上所有結點的值均小于或等于它的根結點的值;
(2)若右子樹不空,則右子樹上所有結點的值均大于或等于它的根結點的值;
(3)左、右子樹也分別為二叉排序樹;
根據二叉樹的定義,左子樹節點值<根節點值<右子樹節點值。所以對二叉排序樹進行中序遍歷,可以得到一個遞增的有序序列。
如圖,中序遍歷的結果為:123468
二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:
(1)若左子樹不空,則左子樹上所有結點的值均小于或等于它的根結點的值;
(2)若右子樹不空,則右子樹上所有結點的值均大于或等于它的根結點的值;
(3)左、右子樹也分別為二叉排序樹;
根據二叉樹的定義,左子樹節點值<根節點值<右子樹節點值。所以對二叉排序樹進行中序遍歷,可以得到一個遞增的有序序列。
如圖,中序遍歷的結果為:123468
二叉排序樹的查找:
二叉排序樹的查找是從根節點開始,沿著某一個分支逐層向下進行比較的過程。若二叉排序樹非空,將給定值與根節點的關鍵字比較,若相等,則查找成功;
若不等,則當根節點的關鍵字大于給定關鍵字值時,在根節點的左子樹查找,否則在跟幾點的右子樹中查找。依次遞歸查找。
如上圖,比如查找值為4的節點,則先與根節點6比較,因為4小于6,所以在根節點的左子樹中繼續查找,又因為4大于2,所以在節點2的右子樹中查找,直至查找成功。
二叉排序樹的插入:
插入節點的過程:若原二叉排序樹為空,則直接插入節點;否則,若關鍵字k小于根節點的關鍵字,則插入到
左子樹中,若關鍵字k大于根節點的關鍵字,則插入到右子樹中。
//
// Created by Administrator on 2018/6/7.
//
/*** 二叉排序樹*/#include "stdio.h"
#include "stdlib.h"
#include "string.h"/*** 定義一棵二叉排序樹*/
#define ElementType char
typedef struct {ElementType data;struct BitSTNode *lchild, *rchild;
} BitSTNode, *BitSTree;/*** 先序遍歷創建一棵二叉樹排序樹* @param tree* @return*/
BitSTree createTree(BitSTree tree) {ElementType c;scanf("%c", &c);if (c == '#') {return -1;} else {tree = (BitSTree) malloc(sizeof(BitSTNode));tree->data = c;tree->lchild = createTree(tree->lchild);tree->rchild = createTree(tree->rchild);}return tree;
}/*** 在二叉排序樹中插入一個關鍵字為k的節點* @param tree 二叉排序樹* @param k 需要拆入的節點元素* @return*/
BitSTree insert(BitSTree tree, ElementType k) {if (tree == NULL) {//原樹節點為空,將新節點插入其中tree = (BitSTree) malloc(sizeof(BitSTNode));tree->data = k;tree->lchild = tree->rchild = NULL;printf("節點%c插入成功~\n", k);return tree;} else if (k == tree->data) {//原樹中已存在節點k,舍棄printf("原樹中已存在節點k\n");return tree;} else if (k > tree->data) {//節點k的值小于樹中此節點的值即k應該插入到右子樹tree->rchild = insert(tree->rchild, k);} else {//節點k的值大于樹中此節點的值即k應該插入到左子樹tree->lchild = insert(tree->lchild, k);}return tree;
}/*** 創建一棵二叉排序樹* @param tree* @param str* @param n*/
BitSTree createBSortTree(BitSTree *tree, ElementType str[], int n) {//用關鍵字數組str[]建立一個二叉排序樹tree = NULL;for (int i = 0; i < n; i++) {tree = insert(tree, str[i]);}return tree;
}/*** 二叉排序樹非遞歸查找* @param T 樹* @param key 需要查找的value* @return*/
BitSTree search(BitSTree T, ElementType key) {while (T && T->data != key) {if (key < T->data) {T = T->lchild;} else {T = T->rchild;}}return T;
}/*** 二叉排序樹遞歸查找* @param T* @param key*/
void recuSearch(BitSTree T, ElementType key) {if (T) {if (key == T->data) {printf("二叉樹tree中已找到%c的位置\n", T->data);return;}if (key < T->data) {recuSearch(T->lchild, key);} else {recuSearch(T->rchild, key);}} else {printf("二叉樹tree中未找到%c的位置\n", key);}
}int main() {BitSTree tree;//加個'\0'表示結尾,否則長度并不是實際長度char str[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', '\0'};int len = strlen(str);tree = createBSortTree(tree, str, len);
// tree = createTree(tree);char D = 'D';char M = 'M';printf("二叉排序樹非遞歸查找:\n");BitSTree locTree = search(tree, 'D');if (locTree) {printf("二叉樹tree中已找到%c的位置\n", locTree->data);} else {printf("二叉樹tree中未找到%c的位置\n", D);}locTree = search(tree, 'M');if (locTree) {printf("二叉樹tree中已找到%c的位置\n", locTree->data);} else {printf("二叉樹tree中未找到%c的位置\n", M);}printf("二叉排序樹遞歸查找:\n");recuSearch(tree, D);recuSearch(tree, M);
}
總結
以上是生活随笔為你收集整理的数据结构-二叉排序树的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。