• 【数据结构】二叉树 学习笔记1


    二叉树是一类树形数据结构,一般二叉树的定义是递归式的。

    二叉树可以用来做什么呢?

    1.完全二叉树是一种非常高效的数据结构。

    2.手写二叉堆需要用到二叉树。

    3.包括map在内的很多STL数据结构内部是用一颗平衡二叉树来维护的。

    为什么说二叉树定义是递归式的?

    因为二叉树的一个节点指向了两个子节点,而子节点又分别指向两个自己的子节点。

    二叉树的实现有两种方式:指针二维数组

    下面分别给出两种方式的C++定义。(指针采用结构体,因为我太懒不想用类来写

    指针式:

    1 struct node{
    2     int value,id;
    3     node* right;node* left;//两个指针指向这个节点的两个儿子
    4 node():value(0),right(NULL),left(NULL){}//构造函数
    5 };

    数组式:

    1 int node[MAX_NUM][2];//u是这个node的下标(id),node[u][0]存储着左/右儿子的下标(id),node[u][1]存储着右/左儿子的下标(id).本身自己不能存值
    3 int val[MAX_NUM]//用于存值 

    相信大家已经看到了,两者的写法各有优劣。指针式逼格更高能节省空间,且是大多数工程代码的接近写法

    而数组式相对于便于理解,简单好写,同时在OI建议用数组式的写法除非非常卡内存void pretvl(node* root)//前序

    指针式:

     1 void pretvl(node* root)//前序
     2 {
     3     printf("%d ",root->id);
     4     if(root->left!=NULL) pretvl(root->left);
     5     if(root->right!=NULL) pretvl(root->right);
     6     return;
     7 }
     8 void intvl(node *root)//中序
     9 {
    10     if(root->left!=NULL) intvl(root->left);
    11     printf("%d ",root->id);
    12     if(root->right!=NULL) intvl(root->right);
    13     return;
    14 }
    15 void postvl(node *root)//后序
    16 {
    17     if(root->left!=NULL)postvl(root->left);
    18     if(root->right!=NULL)postvl(root->right);
    19     printf("%d ",root->id);
    20     return;
    21 }

    数组式:

    1 void pretvl(int root)//只写一个前序遍历,中后一样
    2 {
    3     printf("%d ",root)
    4     if(node[root][0]) pretvl(node[root][0]);
    5     if(node[root][1]) pretvl(node[root][1]);
    6     return;
    7 }

     

  • 相关阅读:
    【数据库】事务,ACID,CAP和一致性
    线程,进程。多进程,多线程。并发,并行的区别
    mysql 集群 数据同步
    如何读取一个表的表类型,以及读取一个表中字段的类型.
    网络攻击技术开篇——SQL Injection
    MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
    程序员找工作那些事(一)幸存者偏差
    程序员
    preg_replace的一些细节
    HDU 1258 Sum It Up(dfs 巧妙去重)
  • 原文地址:https://www.cnblogs.com/JasonY1337357025/p/10311825.html
Copyright © 2020-2023  润新知