zoukankan      html  css  js  c++  java
  • 9、二叉排序树的创建、插入、遍历

    一、二叉排序树介绍:

      二叉排序树又称“二叉查找树”、“二叉搜索树”。二叉排序树:或者是一棵空树,或者是具有下列性质的二叉树:

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

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

      3. 它的左、右子树也分别为二叉排序树。

    二叉排序树通常采用二叉链表作为存储结构。中序遍历二叉排序树可得到一个依据关键字的有序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即是对无序序列进行排序的过程。每次插入的新的结点都是二叉排序树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。搜索、插入、删除的时间复杂度等于树高,期望O(logn),最坏O(n)(数列有序,树退化成线性表,如右斜树)

    二、代码:

    // Sort.cpp : 定义控制台应用程序的入口点。
    //
    #include "stdafx.h"
    #include<windows.h>
    #include<assert.h>
    
    #if 1
    
    typedef int KEY_VALUE;
    
    struct bstree_node {
        KEY_VALUE data;
        struct bstree_node *left;
        struct bstree_node *right;
    };
    
    struct bstree {
        struct bstree_node *root;
    };
    
    //创建节点并给key赋值
    struct bstree_node *bstree_create_node(KEY_VALUE key) {
        struct bstree_node *node = (struct bstree_node*)malloc(sizeof(struct bstree_node));
        if (node == NULL) {
            assert(0);
        }
        node->data = key;
        node->left = node->right = NULL;
    
        return node;
    }
    
    //把节点插入到二叉顺序树中
    int bstree_insert(struct bstree *T, int key) {
    
        assert(T != NULL);
    
        if (T->root == NULL) {
            T->root = bstree_create_node(key);
            return 0;
        }
    
        struct bstree_node *node = T->root;
        struct bstree_node *tmp = T->root;
    
        //node的父节点为tmp,
        while (node != NULL) {
            tmp = node;
            if (key < node->data) {
                node = node->left;
            }
            else {
                node = node->right;
            }
        }
    
        if (key < tmp->data) {
            tmp->left = bstree_create_node(key);
        }
        else {
            tmp->right = bstree_create_node(key);
        }
    
        return 0;
    }
    
    //遍历顺序节点,并输出
    int bstree_traversal(struct bstree_node *node) {
        if (node == NULL) return 0;
    
        bstree_traversal(node->left);
        printf("%4d ", node->data);
        bstree_traversal(node->right);
    }
    
    #define ARRAY_LENGTH        20
    int main() {
    
        int keyArray[ARRAY_LENGTH] = { 24, 25, 13, 35, 23, 26, 67, 47, 38, 98, 20, 13, 17, 49, 12, 21, 9, 18, 14, 15 };
    
        struct bstree T = { 0 };
        int i = 0;
        for (i = 0; i < ARRAY_LENGTH; i++) {
            bstree_insert(&T, keyArray[i]);
        }
    
        bstree_traversal(T.root);
    
        system("pause");
        printf("
    ");
    }
    
    #else
    
    typedef int KEY_VALUE;
    
    
    #define BSTREE_ENTRY(name, type)     
        struct name {                    
            struct type *left;            
            struct type *right;            
        }
    
    struct bstree_node {
        KEY_VALUE data;
        BSTREE_ENTRY(, bstree_node) bst;
    };
    
    struct bstree {
        struct bstree_node *root;
    };
    
    struct bstree_node *bstree_create_node(KEY_VALUE key) {
        struct bstree_node *node = (struct bstree_node*)malloc(sizeof(struct bstree_node));
        if (node == NULL) {
            assert(0);
        }
        node->data = key;
        node->bst.left = node->bst.right = NULL;
    
        return node;
    }
    
    int bstree_insert(struct bstree *T, int key) {
    
        assert(T != NULL);
    
        if (T->root == NULL) {
            T->root = bstree_create_node(key);
            return 0;
        }
    
        struct bstree_node *node = T->root;
        struct bstree_node *tmp = T->root;
    
        while (node != NULL) {
            tmp = node;
            if (key < node->data) {
                node = node->bst.left;
            }
            else {
                node = node->bst.right;
            }
        }
    
        if (key < tmp->data) {
            tmp->bst.left = bstree_create_node(key);
        }
        else {
            tmp->bst.right = bstree_create_node(key);
        }
    
        return 0;
    }
    
    int bstree_traversal(struct bstree_node *node) {
        if (node == NULL) return 0;
    
        bstree_traversal(node->bst.left);
        printf("%4d ", node->data);
        bstree_traversal(node->bst.right);
    }
    
    #define ARRAY_LENGTH        20
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int keyArray[ARRAY_LENGTH] = { 24, 25, 13, 35, 23, 26, 67, 47, 38, 98, 20, 13, 17, 49, 12, 21, 9, 18, 14, 15 };
    
        struct bstree T = { 0 };
        int i = 0;
        for (i = 0; i < ARRAY_LENGTH; i++) {
            bstree_insert(&T, keyArray[i]);
        }
    
        bstree_traversal(T.root);
    
        printf("
    ");
    
        system("pause");
        return 0;
    }
    
    #endif
  • 相关阅读:
    oracle 各个版本下载地址
    学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记
    mysql5.7安装教程图解
    myeclipse2017 安装包及破解插件的下载
    MyEclipse 2017 ci6 安装反编译插件(本人自己摸索的方法,亲测可行)
    Myeclipse10.7安装git插件并将Java项目上传到码云(github)
    IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结
    IntelliJ IDEA使用教程
    IntelliJ idea 中使用Git
    IntelliJ Idea 集成svn 和使用
  • 原文地址:https://www.cnblogs.com/zwj-199306231519/p/14285116.html
Copyright © 2011-2022 走看看