二叉树
树
一,定义:树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。
二,树具有的特点有:
(1)每个结点有零个或多个子结点
(2)没有父节点的结点称为根节点
(3)每一个非根结点有且只有一个父节点
(4)除了根结点外,每个子结点可以分为多个不相交的子树。
三,树的基本关系:
若一个结点有子树,那么该结点称为子树根的“双亲”,子树的根称为该结点的“孩子”。有相同双亲的结点互为“兄弟”。一个结点的所有子树上的任何结点都是该结点的后裔。从根结点到某个结点的路径上的所有结点都是该结点的祖先。
四,部分术语
叶子:度数为1的节点
层次:根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1
树的高度:树中结点的最大层次
森林:0个或多个不相交的树组成。对森林加上一个根,森林即成为树;删去根,树即成为森林。
二叉树
一,定义
二叉树是每个结点最多有两个子树的树结构。它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。
二,二叉树的性质
性质1:二叉树第i层上的结点数目最多为2i-1(i>=1)
性质2:深度为k的二叉树至多有2k-1个结点(k>=1)
性质3:包含n个结点的二叉树的高度至少为(log2n)+1
性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1
性质5:除最后一层外,其余层数节点数均满足2^n-1
三,数组模拟二叉树储存
一,思路
**
约定1号结点为二叉树的根节点,i结点的左子节点和右子节点的编号分别为2i,2i+1
**
二,代码
#include<cstdio>
#include<iostream>
const int Maxn=1000010;
using namespace std;
int tree[Maxn];
void work(int x){
if(tree[x]) printf("%d\n",tree[x]);
if(tree[2*x]) work(2*x);
if(tree[2*x+1]) work(2*x+1);
}
int main(){
int n,l,r;
scanf("%d",&n);
tree[1]=1;
for(int i=1;i<=n;i++){
scanf("%d%d",&l,&r);
tree[der[i]*2]=l;
tree[der[i]*2+1]=r;
}
work(1);
return 0;
}