6二叉树的存储结构与遍历

二叉树

定义:每个结点最多只有两棵子树

性质:

1.在第i层上只有2^(i-1)

2.深度为k的二叉树最多有2^k-1个结点

3.T=n0+n1+n2

4.具有n个结点的完全二叉树深度为log2n+1向下取整

满二叉树:没有度为1的结点,所有的结点都在同一层

完全二叉树:必须按照从上到下,从左到右排列结点

存储方式

将二叉树从上到下,从左到右进行标号,则某个结点X的左孩子结点为2X,右孩子结点为2X+1

数组存储

根节点下标为0,左孩子为2X+1,右孩子为2X+2

缺点:耗费空间
适合完全二叉树或满二叉树
链表存储

数据域和指针域(左右)

树的遍历

先序遍历

中序遍历

后序遍历

层序遍历

#include<stdio.h>
#include<stdlib.h>

typedef struct TreeNode{
struct TreeNode *left,*right;
int data;
}node;

//根据输出顺序的不同分为先序,中序,后序
void traverse(Node *node)
{
if(node==NULL)
{
return;
}
//printf("%d",node->data);
//先中间,再左右
traverse(node->left);
//printf("%d",node->data);
//先左,再中,后右
traverse(node->right);
//printf("%d",node->data);
//先左右,再中间
}

//层序遍历:一层一层输出
//使用队列实现
//实现方法:从根节点入队,出队后将其左右孩子入队,再循环这个操作

层序遍历示例

//层序遍历:一层一层输出
//使用队列实现
//实现方法:从根节点入队,出队后将其左右孩子入队,再循环这个操作
#include<stdio.h>
#include<stdlib.h>
#define SIZE 5
int *queue;
int front;
int end;
int maxSize;

typedef struct ChildBro{
int key;
struct ChildBro *child;
struct ChildBro *sibling;
}Node;

Node *root; //根指针


void Initqueue()
{
queue=(int *)malloc(sizeof(int)*SIZE);
maxSize=SIZE;
front=end=0;
}

void insert_queue(int key)
{
if(isFull())
{
return;
}
else
{
end=(end+1)%maxSize;
queue[end]=key;
}
}

void delete_queue(int key)
{
if(isEmpty())
{
return;
}
else
{
front=(front+1)%maxSize;

}

}

int isFull()
{
if((end+1)%maxSize==front)
{
return 1;
}
else
return 0;
}

int isEmpty()
{
if(end==front)
{
return 1;
}
else
return 0;
}


void Init(int key)
{
root=(Node*)malloc(sizeof(Node));
root->key=key;
root->child=NULL;
root->silbing=NULL;

}

void insert(int key,int parent)
{
//定位结点

Node* temp;

if(temp==NULL)
{

}
else
{
Node*node=(Node*)malloc(sizeof(Node));
node->key=key;
node->child=NULL;
node->sibling=NULL;
if(temp->child==NULL)
{
temp->child=node;
}
else
{
node->sibling=temp->child;
temp->child=node;
}
}
}

//层序遍历核心函数
void levelOrder(Node* root)
{
//传进来的结点不为空
if(root!=NULL)
{
insert_queue(root->key);

}
while(!isEmpty())//一直循环至队列为空
{
int temp=delete_queue();//元素出队
get_node(root,temp);
if(tempNode->child!=NULL)
{
insert_queue(tempNode->child->key)

}
if(tempNode->sibling!=NULL)
{
insert_queue(tempNode->sibling->key)

}


}
}

扩展二叉树(概念)

将一个不是满二叉树的补成一个满二叉树(或完全二叉树)

(将单孩子的结点缺少的结点补成空符号的结点)