二叉树是一类树形数据结构,一般二叉树的定义是递归式的。
二叉树可以用来做什么呢?
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 }