二叉树的概念及结构
概念:
1.空树
2.根节点+根节点的左子树+根节点的右子树(根节点的左右子树也是二叉树)
特点:
1.每个节点最多有两棵树
2.左右子树不能颠倒(有序)
结构:
特殊二叉树:满二叉树及完全二叉树(堆)
满二叉树:每层达到最大值,k层每层节点数都是2^(k-1)满二叉树也是特殊的完全二叉树
**完全二叉树:**有右孩子必须有左孩子
二叉树的存储结构
顺序存储 链式存储
顺序存储:典型的堆(完全二叉树),就是用数组存储,一般适合表示完全二叉树(不是完全二叉树会造成空间上的浪费)所以二叉树的顺序存储在物理上是数组,逻辑上是一颗二叉树。
链式存储:就是用链表表示二叉树,通常的方法是孩子表示法(二叉链)及孩子双亲表示法(三叉链,红黑树)
链表中每个节点有三个域组成,数据域,左右指针域,左右指针域是左右孩子节点所在的存储地址。
二叉树的实现
typedef int BTDatatype;
typedef struct BinTreeNode
{
struct BinTreeNode* left;
struct BinTreeNode* right;
BTDatatype val;
}BTNode;
二叉树的遍历
前序遍历:根节点+左子树+右子树
void befororder(BTNode* root)
{
if(root)
{
printf("%d",root->val);
befororder(root->left);
befororder(root->right);
}
}
中序遍历:左+根+右
void inoder(BTNode *root)
{
if(root)
{
inoder(root->left);
printf("%d",root->val);
inoder(root->right);
}
}
后序遍历:左+右+根
void endoder(BTNode* root)
{
if(root)
{
endoder(root->left);
endoder(root->right);
printf("%d",root->val);
}
}
层序遍历(队列先进先出)
#inclde<queue>
void leveoder(BTNode* root)
{
if(root0
{
std::queue<BTNode *>q;
q.push(root);
while(!q.empty())
{
BTNode* newnode = q.front();
q.pop();
printf("%d",newnode->val);
if(newnode->left != NULL)
{
q.push(newnode->left);
}
if(newnode->right != NULL)
{
q.push(nnewnode->right);
}
}
}
printf("\n");
}
二叉树的创建
BTNode* BuyBinTreeNode(BTDatatype data)
{
BTNode * pnewnode = (BTNode*)malloc(sizeof(BTNode));
if(pnewnode == NULL)
{
assert(0);
return NULL;
}
pnewnode->left = NULL;
pnewnode->right = NULL;
pnewnode->val = data;
return pnewnode;
}
BTNode* _BTcreattree(int* array,int size,int index,int invalid)
{
BTNode* root = NULL;
if(array[*index] != invalid&&index<size)
{
root = BuyBinTreeNod(array[*index]);
root->left = _BTcreattree(array,size,++(*index),invalid);
root->right = _BTcreattree(array,size,++(*index),invalid)
}
return root;
}
BTNode* btcreattree(int *array,int size,BTDatatype invalid)
{
int index = 0;
return _BTcreattree(array,size,index),invalid);
}