zoukankan      html  css  js  c++  java
  • 【数据结构】二叉树 学习笔记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 }

     

  • 相关阅读:
    jQuery全选反选全不选
    Ubuntu安装VMware Workstation8.0.3
    ubuntu安装的软件如何启动
    ubuntu装VirtualBox遇到的问题
    你是优秀的PHP程序员吗?
    VMWare 三种工作模式(bridged、hostonly、NAT)
    最近要做的事
    090224
    2月23日 月曜日
    周五 26日
  • 原文地址:https://www.cnblogs.com/JasonY1337357025/p/10311825.html
Copyright © 2011-2022 走看看