【数据结构】二叉树基本内容整理(一)
一、二叉树的定义:度数(每个节点所有的子树的最大值)为2的数。
二、二叉树的性质:
1.在二叉树的第 i 层上最多有 2 ^ (i - 1) 个结点;
2.深度为 k 的二叉树最多有 2 ^ k - 1 个结点;
2-1.一棵深度为 k 且有 2 ^ k - 1 个结点的二叉树被称为满二叉树;
2-2.将满二叉树的每一个结点从上而下,从左到右编上序号(1~2 ^ k - 1)。一棵深度为 k ,有 n 个结点的二叉树当且仅当其每一个结点都与深度为 k 的满二叉树一一对应时(即只有最后倒数第二层有度数不为2的结点,只有最后一层结点相对于满二叉树有缺失,且最后一层缺失的结点是从最右到左连续的),这棵树被称为完全二叉树;
3.对于任意一棵二叉树,其叶结点数一定比度为2的结点数多1。即:n0 = n2 + 1;
4.具有 n 个结点的完全二叉树的深度为 floor(log2 n) + 1(floor指向下取整);
5.对于一棵 n 个结点的完全二叉树,对任意一个结点(编号为 i ),有:
5-1.如果 i = 1,那么此结点为根结点,否则其父结点编号为 floor(i / 2)(在程序中可直接写为 i / 2);
5-2.如果 2*i > n,则此结点没有孩子,是根结点;如果 2*i == n,则此结点只有左孩子,其编号为 2*i ;否则此节点有左孩子和右孩子,编号分别为 2*i 和 2*i + 1。
三、二叉树的存储:链式存储结构:
1 struct node 2 { 3 DATA_TYPE data;//数据 4 node* leftChild,rightChild;//左孩子和右孩子 5 }; 6 node* bt;//根结点
四:二叉树的遍历(每种遍历在二叉树为空时不进行操作)
1.先序遍历:(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树(根->左->右)
2.中序遍历:(1)中序遍历左子树;(2)访问根结点;(3)先序遍历右子树(左->根->右)
3.后序遍历:(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点(左->右->根)
void pre(node* bt)//先序遍历 { if(bt) { cout<<bt->data; pre(bt->leftChild); pre(bt->rightChild); } } void in(node* bt)//中序遍历 { if(bt) { in(bt->leftChild); cout<<bt->data; in(bt->rightChild); } } void post(node* bt)//后序遍历 { if(bt) { post(bt->leftChild); post(bt->rightChild); cout<<bt->data; } }