数据结构与算法分析-树、二叉树、二叉查找树

作者:xiabodan 出处:http://blog.csdn.net/xiabodan

二叉树

二叉树的申明:

struct node
{
  int data;
  struct node *left;
  struct node *right;
};

新建一个节点

/* newNode() allocates a new node with the given data and NULL left and
   right pointers. */
struct node* newNode(int data)
{
  // Allocate memory for new node
  struct node* node = (struct node*)malloc(sizeof(struct node));

  // Assign data to this node
  node->data = data;

  // Initialize left and right children as NULL
  node->left = NULL;
  node->right = NULL;
  return(node);
}

二叉查找树

使得二叉树成为二叉查找树的重要性质就是树中的每个节点X,它的左子树所有的关键字值小于X的关键字,而它的右子树中的所有关键字值大于X的关键字值。这就意味着该树所有的元素可以用某种统一的方式排序。

#include <stdlib.h>
#include <stdio.h>

typedef int elementtype;
typedef struct node* position;
typedef struct node* bsearchtree;

bsearchtree MakeEmpty(bsearchtree T);
position find(elementtype data,bsearchtree T);
position findmax(bsearchtree T);
position findmin(bsearchtree T);
bsearchtree insert(elementtype data,bsearchtree T);
bsearchtree delete(elementtype data,bsearchtree T);
void print_tree(bsearchtree T);

struct node {

    elementtype data;
    position    left;
    position    right;

};

bsearchtree MakeEmpty(bsearchtree T)
{
    if(NULL != T)
    {
        MakeEmpty(T->left);
        MakeEmpty(T->right);
        free(T);
    }
    return NULL;
}

position find(elementtype data,bsearchtree T)
{
    if(NULL == T)
        return NULL;
    if(T->data > data)
        return find(data,T->left);
    if(T->data < data)
        return find(data,T->right);
    else
        return T;
}

position findmin(bsearchtree T)
{
    if(NULL == T)
        return NULL;
    if(T->left == NULL)
        return T;
    else
        return findmin(T->left);
}

position findmax(bsearchtree T)
{
    if(NULL != T)
        while(T->right != NULL)
            T = T->right;
    return T;
}

bsearchtree insert(elementtype data,bsearchtree T)
{
    if(NULL == T)
    {
        T = (position)malloc(sizeof(position));
        T->data     = data;
        T->left     = NULL;
        T->right    = NULL;
    }
    else
    {
        if(data < T->data)
            T->left = insert( data, T->left);
        if(data > T->data)
            T->right = insert(data, T->right);
        //when T->data == data do nothing
    }

    return T;//return root node
}
bsearchtree delete(elementtype data,bsearchtree T)
{
    position tem;
    if(NULL == T)
        printf("delete:error T is empty");
    else if(data<T->data)
        T->left = delete(data,T->left)  ; //go left to find data
    else if(data>T->data)
        T->right= delete(data,T->right) ; //go right to find data
    else if(T->left && T->right)          //data is  found here ,and need to be deleted element   have  both children
    {
        //replace wih smallest in right subtree
        tem = findmin(T->right);
        T->data = tem->data;
        T->right = delete(T->data,T->right);
    }
    else  //need to be deleted element   just have one children
    {
        tem = T;
        if(NULL == T->left )
            T = T->right;
        if(NULL == T->right)
            T = T->left;
        free(tem);
    }

    return T;
}   

void print_tree(bsearchtree T)
{
    if(NULL ==T)
        return;
    print_tree(T->left);
    printf("  %d \n",T->data);
    print_tree(T->right);
}

int main(int argc, char** argv)
{
    bsearchtree T;
    position P;
    T = insert(12,T);
    T = insert(2,T);
    T = insert(22,T);
    T = insert(7,T);
    T = insert(54,T);
    T = insert(23,T);
    T = insert(18,T);
    T = insert(48,T);
    T = insert(112,T);
    T = insert(42,T);
    T = insert(222,T);
    T = insert(57,T);
    T = insert(84,T);
    T = insert(16,T);
    T = insert(455,T);
    T = insert(59,T);
    print_tree(T);

    //P = find( 22,T);
    if(T  != NULL) {
        T = delete(22,T);
        printf("After deletion:\n");
        print_tree(T);
    }
    return 0;
}
时间: 2024-08-28 10:56:42

数据结构与算法分析-树、二叉树、二叉查找树的相关文章

数据结构与算法-树-二叉树与郝夫曼树

二叉树的遍历 二叉树的遍历指的是从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次. 二叉树的遍历方法: 前序遍历:规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树. 1 void PreOrderTraverse(BiTree T) 2 { 3 if(T == NULL) 4 return; 5 printf("%c",T->data);/*显示结点数据,可以更改为其他对结点操作*/ 6 PreOr

数据结构和算法分析(11)树的简介

    对于大量的数据,链表的线性访问时间太慢,不宜使用.我们介绍一种简单的数据结构,其大部分操作的平均时间为O(log N).     (1)学习目标: 我们将要涉及到的数据结构叫做二叉查找树(binary search tree). 我们将要了解如下内容: 1.了解树是如何用于实现几个流行的操作系统中的文件系统的; 2.看到树如何能够用来计算算术表达式的值; 3.如何指出利用树支持以O(log N)平均时间进行的各种搜索操作,以及如何细化得到最坏情况时间界O(log N).我们还将讨论当数据

《数据结构与算法分析:C语言描述》复习——第四章“树”——AVL树

2014.06.15 16:22 简介: AVL树是一种高度平衡的二叉搜索树,其命名源自于联合发明算法的三位科学家的名字的首字母.此处“平衡”的定义是:任意节点的左右子树的高度相差不超过1.有了这个平衡的性质,使得AVL树的高度H总是接近log(N),因此各种增删改查的操作的复杂度能够保证在对数级别.没有bad case是AVL树与普通的二叉搜索树的最大区别.为了实现平衡性质,我们需要记录每个节点的高度(或者平衡因子)来检测不平衡的情况.为了修正高度不平衡,需要用到“旋转”的方法,分为单旋转和双

数据结构与算法分析-AVL树深入探讨

.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top: 0 } .todo { font-family: monospace; color: red } .done { font-family: monospace; color: green } .priority { font-fami

数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树 二叉树的创建,关系建立 二叉树的创建,关系建立2 三叉链表法 双亲链表: 二叉树的遍历 遍历的分析PPT 计算二叉树中叶子节点的数目:使用全局变量计数器 计算二叉树中叶子节点的数目:不使用全局变量计数器 无论是先序遍历,中序遍历,后序遍历,求叶子的数字都不变;因为本质都是一样的,任何一个节点都会遍历3趟 求二叉树的高度 二叉树的拷

6. 蛤蟆的数据结构进阶六之二叉树排序树

6. 蛤蟆的数据结构进阶六之二叉树排序树 本篇名言:"有些人因为贪婪,想得更多的东西,却把现在所有的也失掉了. -- 伊索" 关于理论知识已经在上篇中进行描述,这篇我们主要来看下如何是实现二叉排序树. 欢迎转载,转载请标明出处: 1.  二叉排序树的定义 二叉排序树(BinarySort Tree)又称二叉查找(搜索)树(Binary Search Tree).其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: ①若它的左子树非空,则左子树上所有结点的值均小于根结点的值: ②

[数据结构与算法分析(Mark Allen Weiss)]二叉树的插入与删除 @ Python

二叉树的插入与删除,来自Mark Allen Weiss的<数据结构与算法分析>. # Definition for a binary tree node class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class BinarySearchTree: # @param root, a tree node # @return a list of integers def

《数据结构与算法分析—C语言描述》pdf

下载地址:网盘下载 内容简介 编辑 <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行时间分析的基础上考查了一些高级数据结构,从历史的角度和近年的进展对数据结构的活跃领域进行了简要的概括.由于<数据结构与算法分析:C语言描述(原书第2版)>选材新颖,方法实用,题例丰富,取舍得当.<数据结构与算法分析:C语言描述(原书第2版)>的目的是培养学生良好的程序设计技巧和熟练的算

数据结构与算法分析-索引

作者:xiabodan 出处:http://blog.csdn.net/xiabodan 算法和数据结构是计算机科学的核心内容.作为程序猿,编程是我们的实战项目.然而,写出程序还不够.一个程序在应对一些大型而复杂的情况时.会耗费大量的时间.我们能够非常easy写出一个从文件里找到一个词的程序.比方逐词扫描.看是否相符.但假设我们的文件有几十TB,并且要从文件里找到上百个词,逐个扫描的办法就差点儿不可行.我们须要优化程序,以便我们的程序能够应对复杂问题. 算法研究解决这个问题的方法,而数据结构则是