E.pXIphp

【数据结构】二叉树 学习笔记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 }

 

 

 

 

posted @ 2019-01-23 22:04  Ekretn  阅读(245)  评论(0编辑  收藏  举报