二叉树:
概念:度最大为二的树
形态:空树;只有根节点;只有左子女;只有右子女;既有左子女,也有右子女。
【表示】:
1. 二元组表示:<前驱,后继> 序偶:尖括号表示一对节点
eg:DATA={A,B,C,D,E,F,G,H,I}
BR={
<A,B>,<A,C>,<B,D>,<B,E>,<C,F>,<E,G>,<E,H>,<F,I>}
2. 广义表示法: 双亲(左子女,右子女)
eg: DATA={A,B,C,D,E,F,G,H,I}
A(B(D,E(D,H)),C( ,F( I ))) 【若缺失左子女,逗号不可省略】
【二叉树的性质】:
①:叶子节点总比双分支节点个数多一
②:将一棵满二叉树按层进行编号,层数设为i,则每一层都有 2^(i-1)个节点,一棵h层的二叉树有(2^h -1)个节点。
创建二叉搜索树:
二叉搜索树:左子女的数据域值小于或等于根节点的数据域值,右子女的数据域值大于或等于根节点的值
节点类型:[左子女节点地址]<-[节点数据]->[右子女节点地址]
则有:
typedef struct node{
int data;
struct node* left;
struct node* right;
}BTnode;
代码如下——>
/*通过已有数组元素创建二叉搜索树
先为root分配单元,将数组中的第一个元素放置在root->data 上,然后遍历数组其他元素
用指针c 在二叉树上跑,指针pa 跟在c 的后面,当要插入的元素比 c 大时,c 往右边跑,反之往左边跑
c 为空时停下来,pa 指在待被插结点上,然后判断待插结点p 与 pa 的大小,小的插在左边,大的插在右边
结束后返回根节点root ,二叉搜索树创建完成 */
BTnode* BtSearchTree::CreateBtSearchTree(int a[]){
BTnode * root , *p, *pa, *c ;
int i;
root=(BTnode *)malloc(sizeof(BTnode));
root->data = a[0];
root->left= root->right= NULL;
for(i=1; i<N; i++){
p=(BTnode *)malloc(sizeof(BTnode));
p->data= a[i];
p->left=p->right= NULL;
c= root;
while(c){
pa= c;
if(c->data< p->data)
c= c->right;
else
c= c->left;
}
if(pa->data > p->data)
pa->left= p;
else
pa->right= p;
}
return root;
}
创建完全二叉树:
完全二叉树:
一棵h层的二叉树,前h-1 层是满的,第h层连续缺失右边子女
i.满二叉树是特殊的完全二叉树
ii.完全二叉树最多只有一个单分支
iii.一棵h层的完全二叉树有n个节点,则:(n<=2^h-1)&&(n>2^(h-1)-1)==>2^(h-1)<n+1<=2^h h-1<log2(n+1)<=h
代码如下——>
#define N 8
typedef struct node{
int data;
struct node* left;
struct node* right;
}BTnode;
/*使用队列 创建完全二叉树;由完全二叉树的性质可知,使用顺序存储满足完全二叉树的存储特点,便采用队列*/
BTnode * CreateCompleteBiTree(int a[]){
BTnode **Q, *pa, *p, *root;
Q=(BTnode **)malloc(N*sizeof(BTnode *)); //给队列Q 分配单元
int front,rear;
front= rear = 0; //初始化
int i;
root= (BTnode *)malloc(sizeof(BTnode)); //初始化根节点
root->data= a[0];
root->left= root->right= NULL;
pa= root; //使pa 指向根节点
for(i= 1; i<N; i++){ //对a[1]~a[N]的数据进行遍历,最终完成完全二叉树的遍历
p= (BTnode *)malloc(sizeof(BTnode));
p->data= a[i];
p->left= p->right = NULL;
if(!pa->left ) //如果待插结点pa 左空, p插在左边
pa->left =p;
else{ //左不空,右空,p插在右边
pa->right= p;
pa= Q[++front]; //pa 出队
}
Q[++rear]= p; //p 入队
}