二叉树概念
把满足一下2个条件的树结构称为二叉树(Binary Tree):
- 每个结点的度都不大于2。
- 每个结点的孩子结点次序不能任意颠倒。
性质
- 在二叉树的第 i 层上至多有2i-1 个结点(i >= 1)。
- 深度为 k 的二叉树至多有2k-1个结点。
- 对任意一棵二叉树T,若终端结点数(叶子结点)为n0,而其度为2的结点数为n2,则n0=n2+n1。( ☆☆☆☆☆)。
- 具有n个结点的完全二叉树的深度为 ⌊ log2n⌋+1( ⌊ ⌋是下取整符号(floor) ) 。
存储结构
1.顺序存储
2. 链式存储
若一个二叉树含有n个结点,则它的二叉链表中必含有2n个指针域,其中必有n+1个空链域
结构
typedef struct Node{
DataType data;
struct Node *LChild;
struct Node *RChild;
}BiTNode, *BiTree;
创建
void CreatBiTree(BiTree *bt){
char a;
a = getchar();
if(a == ' ')
(*bt)= NULL;
else{
(*bt )=(BiTree)malloc(sizeof(BiTNode));
(*bt)->date=a;
CreatBiTree(&((*bt)->LChild));
CreatBiTree(&((*bt)->RChild));
}
}
遍历
1.先序遍历(DLR)
void PreOrder(BiTree root){
if(root != NULL){
Visit(root->data);
PreOrder(root->LChild);
PreOrder(root->RChild);
}
}
2.中序遍历(LDR)
void InOrder(BiTree root){
if(root != NULL){
InOrder(root->LChild);
Visit(root->data);
InOrder(root->RChild);
}
}
3.后序遍历(LRD)
void PostOrder(BiTree root){
if(root != NULL){
PostOrder(root->LChild);
PostOrder(root->RChild);
Visit(root->data);
}
}
用例
首先要把树转变为二叉树
- 树中所有相邻兄弟之间加一条线。
- 对树中的每个结点,只保留与其第一个孩子结点之间的连线,删去其与其他孩子结点之间的连线。
- 以树的根结点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。
图中树变为二叉树如下图所示
由ABEFCGD输出得知二叉树采用先序遍历,问题的难点在于结点前的空格数,经过观察,得到一个规律,结点的左孩子的空格数比结点大1,右孩子结点的空格数和结点相等。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
char date;
int num;
struct Node *LChild;
struct Node *RChild;
}BiTNode, *BiTree;
//建表
void CreatBiTree(BiTree *bt){
char a;
a = getchar();
if(a == '#')
(*bt)= NULL;
else
{
(*bt )=(BiTree)malloc(sizeof(BiTNode));
(*bt)->date=a;
CreatBiTree(&((*bt)->LChild));
CreatBiTree(&((*bt)->RChild));
}
}
//k代表空格数,初始为 0
void Init(BiTree root,int k){
root->num=k;
}
void PreOrder(BiTree root){
if(root){
if(root->LChild)//左孩子 +1
root->LChild->num=root->num+1;
if(root->RChild)//右孩子空格数 = 父结点 空格数
root->RChild->num=root->num;
PreOrder(root->LChild);
PreOrder(root->RChild);
}
}
void PrintTree(BiTree root){
if(root!=NULL){
for(int i=0;i<root->num;i++)
printf(" ");
printf("%c\n",root->date);
PrintTree(root->LChild);
PrintTree(root->RChild);
}
}
int main(){
BiTree bt;
printf("Enter: ABE#F##CG##D###\n");
CreatBiTree(&bt);
Init(bt,0);
PreOrder(bt);
PrintTree(bt);
}
运行结果: