【数据结构5】树

  • 树的定义
  • 树的遍历
    • 前序遍历
    • 中序遍历
    • 后序遍历
  • 二叉搜索树

树的定义

typedef struct node {
        int data;
        struct node * left, *right, *parent;
}Node, *Tree;

树的遍历

前序遍历

void pre_order(Tree t){
        if(t){
                printf("pre order: %d.\n", t->data);
                pre_order(t->left);
                pre_order(t->right);
        }
}

中序遍历

void middle_order(Tree t){
        if(t){
                middle_order(t->left);
                printf("middle order: %d.\n", t->data);
                middle_order(t->right);
        }
}

后序遍历

void post_order(Tree t){
        if(t){
                post_order(t->left);
                post_order(t->right);
                printf("post order: %d.\n", t->data);
        }
}

二叉搜索树

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

typedef struct node {
        int data;
        struct node * left, *right, *parent;
}Node, *Tree;

Tree search_tree_insert(Tree T, int k){
        Tree root = T;

        Node* node = (Node*)malloc(sizeof(Node));
        node->data = k; node->left = NULL; node->right = NULL; node->parent = NULL;

        Node* parent = NULL;
        for(;T != NULL;)
        {
                parent = T;
                if(k < T->data) T = T->left;
                else T = T->right;
        }
        node->parent = parent;
        if(parent == NULL) return node; // Tree T is Null
        else if(k < parent->data) parent->left = node;
        else parent->right = node;

        return root;
}

void middle_order(Tree t){
        if(t){
                middle_order(t->left);
                printf("middle order: %d.\n", t->data);
                middle_order(t->right);
        }
}

int main()
{
        Tree tree_root = (Tree)malloc(sizeof(Node));
        tree_root->left = NULL; tree_root->right = NULL; tree_root->parent = NULL;

        int d;
        // first date at root node
        scanf("%d", &d);
        tree_root->data = d;
        // 二叉搜索树插入数据
        for(int i = 1; i <5 ; i++){
                scanf("%d", &d);
                tree_root = search_tree_insert(tree_root,d);
        }
        // 中序遍历二叉搜索树
        middle_order(tree_root);

        return 0;
}                                              

Wu_Being 博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!
《【数据结构5】树》
http://blog.csdn.net/u014134180/article/details/55506250

如果你看完这篇博文,觉得对你有帮助,并且愿意付赞助费,那么我会更有动力写下去。

时间: 2024-08-01 03:38:03

【数据结构5】树的相关文章

一个数据结构B_树问题

问题描述 一个数据结构B_树问题 一棵5阶B_树,高度是5,(叶子层不算)至少有多少个结点?------ 解决方案 高度为h的m阶B树至少有 1 + 2 * (1 - (m / 2) ^ (h - 1)) / (1 - ( m / 2)) 个结点 代入h=5 m=5,得到52. 解决方案二: B+树数据结构数据结构B-树数据结构B树

Linux 内核里的数据结构——基数树

Linux 内核里的数据结构--基数树 正如你所知道的,Linux内核提供了许多不同的库和函数,它们实现了不同的数据结构和算法.在这部分,我们将研究其中一种数据结构--基数树Radix tree.在 Linux 内核中,有两个文件与基数树的实现和API相关: include/linux/radix-tree.h lib/radix-tree.c 让我们先说说什么是 基数树 吧.基数树是一种 压缩的字典树compressed trie ,而字典树是实现了关联数组接口并允许以键值对 方式存储值的一种

Python数据结构——AVL树的实现

既然,我们已经证明,保持 AVL 树的平衡将会使性能得到很大的提升,那我们看看如何在程序中向树插入一个新的键值.因为所有的新键是作为叶节点插入树的,而新叶子的平衡因子为零,所以我们对新插入的节点不作调整.不过一旦有新叶子的插入我们必须更新其父节点的平衡因子.新叶子会如何影响父节点的平衡因子取决于叶节点是左子节点还是右子节点.如果新节点是右子节点,父节点的平衡因子减 1.如果新节点是左子节点,父节点的平衡因子将加 1.这种关系可以递归地应用于新节点的前两个节点,并有可能影响到之前的每一个甚至是根节

数据结构之树

树:非线性结构------其实更像是一串葡萄,哈哈 定义: 专业定义: 1.有且只有一个成为根节点: 2.有若干个互不相交的的子树,这些子树本身也是一颗树: 通俗的定义: 1.树是由节点和边(指针域)组成: 2.每个节点只有一个父节点,但可以有很多个子节点: 3.但有一个节点例外,该节点没有父节点,此节点成为根节点: 涉及的术语: 节点, 父节点, 子节点, 子孙, 堂兄弟: 深度:从根节点到最底层节点的层数称之为深度: 叶子节点:没有子节点的节点 非终端节点:实际就是非叶子节点 度:子节点的个

数据结构之树、森林和二叉树的转换

树转换为二叉树 (1)加线.在所有兄弟结点之间加一条连线. (2)去线.树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线. (3)层次调整.以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明.(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子) 森林转换为二叉树 (1)把每棵树转换为二叉树. (2)第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来. 二叉树转换为树 是树转换为二

数据结构C#版笔记--树与二叉树

图1 上图描述的数据结构就是"树",其中最上面那个圈圈A称之为根节点(root),其它圈圈称为节点(node),当然root可以认为是node的特例. 树跟之前学习过的线性结构不同,它是一对多的非线性结构,具有二个基本特点: 1.根节点(root)没有前驱节点,除root之外的所有节点有且只有一个前驱节点2.树中的所有节点都可以有0个或多个后继节点. 所以下面这些歪瓜咧枣,不能算是树: 图2 下是是一些烦人但是很重要的术语:  1.结点(Node):表示树中的数据元素,由数据项和数据元

索引-数据结构的B树的问题,有点不会

问题描述 数据结构的B树的问题,有点不会 下列陈述中,哪些是不正确的 A.m阶B树中任何一个结点的左右子树的高度都相等 B.含10个叶结点的3阶B树中至多有8 个非叶结点 C. B树是一种动态索引结构,既适用于随机查找,也适用于顺序查找. D.对于B树中任何一个非叶结点中的关键码K来说,比K大的最小关键码和比K小的最大关键码一定都在叶结点中 解决方案 含10个叶结点的3阶B树中至多有8 个非叶结点 错,6个 B树是一种动态索引结构,既适用于随机查找,也适用于顺序查找.错不能顺序查找 解决方案二:

数据结构之伸展树详解_C 语言

1. 概述 二叉查找树(Binary Search Tree,也叫二叉排序树,即Binary Sort Tree)能够支持多种动态集合操作,它可以用来表示有序集合.建立索引等,因而在实际应用中,二叉排序树是一种非常重要的数据结构. 从算法复杂度角度考虑,我们知道,作用于二叉查找树上的基本操作(如查找,插入等)的时间复杂度与树的高度成正比.对一个含n个节点的完全二叉树,这些操作的最坏情况运行时间为O(log n).但如果因为频繁的删除和插入操作,导致树退化成一个n个节点的线性链(此时即为一个单链表

[算法系列之二十三]线段树(Interval Tree)

一 背景 在信息学竞赛中,我们经常会碰到一些跟区间有关的问题,比如给一些区 间线段求并区间的长度,或者并区间的个数等等.这些问题的描述都非常简单,但是通常情况下数据范围会非常大,而朴素方法的时间复杂度过高,导致不能在规定时间内得到问题的解.这时,我们需要一种高效的数据结构来处理这样的问题,在本文中,我们介绍一种基于分治思想的数据结构--线段树. 二 简介 线段树是一种二叉树形结构,属于平衡树的一种.它将线段区间组织成树形的结构,并用每个节点来表示一条线段.一棵[1,10)的线段树的结构如图1.1

《程序设计解题策略》——1.5 利用动态树维护森林的连通性

1.5 利用动态树维护森林的连通性 本节将介绍一种特殊的数据结构--动态树(dynamic tree).在正式介绍动态树之前,我们先来分析一个带有普遍性的问题.1.5.1 动态树的问题背景 给出一棵共有n(n≤10000)个节点的树,每条边都有一个权值,要求维护一个数据结构,支持如下操作: 操作1--修改某条边的权值. 操作2--询问某两个节点之间唯一通路上的最大边权. 其中操作的总次数为q. 对于操作2,我们很容易想到一种算法:先求出被询问的两节点的最近公共祖先,然后分别求出这两个节点至最近公