博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构——树的概述
阅读量:4098 次
发布时间:2019-05-25

本文共 3461 字,大约阅读时间需要 11 分钟。

:跟数组,链表,堆栈,队列不一样,这些都是线性的数据结构,而树呢是层级类的数据结构。

树的词汇表:最上层的节点叫树根节点,一个元素下层的直接元素称为它的孩子节点。直接上层节点称为父节点。例如a是f的孩子,并且f是孩子的父亲。最后没有孩子节点的元素称为叶子节点。

tree      ----       j    <-- root     /   \    f      k    /   \      \ a     h      z    <-- leaves

为啥要用树?

  1. 用树的一个原因就是我们想要存储信息,这些信息可以形成层级关系。例如计算机的文件系统:
file system       -----------         /    <-- root        /      \      ...       home      /          \   ugrad        course    /       /      |     \  ...      cs101  cs112  cs113
  1. 树(带有顺序的,例如:BST)可以提供更好的访问与查询(比链表快但是比数组慢)。
  2. 树提供更好的插入删除功能(比数组快,但是比无序的链表慢)。
  3. 与链表类似,但是与数组不同,树没有节点数目的上限,因为节点之间是通过指针连接的

树的主要应用

  1. 操作层级数据
  2. 让检索信息变得更加容易(见树的遍历)
  3. 操作有序的数据列表
  4. 作为合成数字图像特效的工作流
  5. 路由器算法
  6. 多边决策的表格

二叉树:一个树中的元素最多有两个孩子节点,叫做二叉树。因为二叉树中每个节点只有两个孩子,所以我们一般叫它们左孩子与右孩子。

C语言表示的二叉树:一个树通过一个指向最顶部的节点的指针来表示,如果这个树为空,那么根节点的值为NULL

一个树的节点包含一下内容:

1. 数据
2. 指向左孩子的指针
3. 指向右孩子的指针

在C语言中,我们可以用结构体表示一个树的节点。下面就是一个带有整数数据的树节点的例子:

struct node {  int data;  struct node *left;  struct node *right;};
/* Class containing left and right child of current node and key value*/class Node{    int key;    Node left, right;    public Node(int item)    {        key = item;        left = right = null;    }}

用C写的第一个简单树

tree      ----       1    <-- root     /   \    2     3     /     4
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);}int main(){  /*create root*/  struct node *root = newNode(1);    /* following is the tree after above statement         1      /   \     NULL  NULL    */  root->left        = newNode(2);  root->right       = newNode(3);  /* 2 and 3 become left and right children of 1           1         /   \        2      3     /    \    /  \    NULL NULL NULL NULL  */  root->left->left  = newNode(4);  /* 4 becomes left child of 2           1       /       \      2          3    /   \       /  \   4    NULL  NULL  NULL  /  \NULL NULL*/  getchar();  return 0;}

Java实现

/* Class containing left and right child of current   node and key value*/class Node{    int key;    Node left, right;    public Node(int item)    {        key = item;        left = right = null;    }}// A Java program to introduce Binary Treeclass BinaryTree{    // Root of Binary Tree    Node root;    // Constructors    BinaryTree(int key)    {        root = new Node(key);    }    BinaryTree()    {        root = null;    }    public static void main(String[] args)    {        BinaryTree tree = new BinaryTree();        /*create root*/        tree.root = new Node(1);        /* following is the tree after above statement              1            /   \          null  null     */        tree.root.left = new Node(2);        tree.root.right = new Node(3);        /* 2 and 3 become left and right children of 1               1             /   \            2      3          /    \    /  \        null null null null  */        tree.root.left.left = new Node(4);        /* 4 becomes left child of 2                    1                /       \               2          3             /   \       /  \            4    null  null  null           /   \          null null         */    }}

总结:树是一种层级的数据结构。树主要用于维护层级数据,提供更方便的访问,插入删除功能。二叉树是树的特例,它的每个节点最多有两个孩子。

转载地址:http://wkhii.baihongyu.com/

你可能感兴趣的文章
每天抽四小时看这些Redis、JVM、分布式、高并发、多线程、面试题
查看>>
全网最通俗易懂的Kafka入门
查看>>
面试过阿里的P7大佬分享:180+道Java面试题目!含答案解析!
查看>>
这可能是目前最透彻的Netty原理架构解析
查看>>
2年Java,面试蚂蚁金服总结
查看>>
一个五年开发的Java程序员应聘16k没要,因为他只会增删改查?细节如下
查看>>
阿里Redis最全面试全攻略,读完这个就可以和阿里面试官好好聊聊
查看>>
阿里巴巴的26款超神Java开源项目
查看>>
一篇文章,教你学会Git
查看>>
设计一个百万级的消息推送系统
查看>>
直播平台整体架构
查看>>
阿里最全面试116题:阿里天猫、蚂蚁金服、阿里巴巴面试题含答案
查看>>
有哪些 Java 源代码看了后让你收获很多,代码思维和能力有较大的提升?
查看>>
阿里p7笔试题
查看>>
在中国,有多少程序员干到40了?那么其他人去干什么了?
查看>>
阿里P8Java架构师是如何规划架构体系的呢?
查看>>
京东4面(Java研发):事务隔离+乐观锁+HashMap+秒杀设计+微服务
查看>>
到了2020年,年薪80w的阿里P7+,需要掌握什么样的技术水平?
查看>>
老王:我是如何成为公司的主力架构师、技术总监
查看>>
Java程序员为什么要用Redis?
查看>>