【数据结构】二叉树

二叉树的概念及结构

概念:
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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值