树(二叉树)

一.概念

1.要记得:

①.节点的度:一个节点含有子树的个数

②.叶节点/终端节点:度为0的节点

③.树的高度/深度:树的层次有多少次

2.了解的:

①.非终端节点/分支节点:度不为0的节点

②双亲节点/父节点:一个节点的前驱称为该节点的双亲节点/父节点

③.兄弟节点:同一个父节点的节点

④.树的度:所有节点中度最大的节点的度

⑤.节点的层次

⑥.堂兄弟节点:双亲在同一层的节点

⑦.节点的祖先:该节点的所有前驱节点都是该节点的祖先

⑧.节点的子孙结点

⑨森林:多棵树

二.二叉树

1.二叉树:每个节点度不大于2的树

//二叉树
typedef char BTDataType;
typedef struct BinaryTreeNode
{
 BTDataType _data;
 struct BinaryTreeNode* _left;
 struct BinaryTreeNode* _right; }BTNode;
// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
Node* creatBinaryTree(DataType arr[],int* ind){
  if(arr[*idx] == '#'){
  (*idx)++;
  return NULL;
}

//当前树的根节点
NOde* root = (Node*)malloc(sizeof(Node));
root->data = arr[*idx];
(*idx)++;
root->left = creatBinaryTree(arr,idx);
root->right = creatBinaryTree(arr,idx);
return root;
// 二叉树销毁
void BinaryTreeDestory(Node** root){
if(*root){
BinaryTreeDestory(&((*root)->left));
BinaryTreeDestory(&((*root)->right));
free(*root);
*root = NULL;
}
}
// 二叉树节点个数
int BinaryTreeSize(Node* root){
if(root ==NULL)
return 0;
return BinaryTreeSize(root->left)+BinaryTreeSize(root->right)+1;
//二叉树的深度
int bTreeHeight(Node* rooot){
if(root == NULL)
return 0;
int left = bTreeHeight(root->left);
int right = bTreeHeight(root->right);
return left > right ? left + 1 : right + 1;
// 二叉树叶子节点个数
int BinaryTreeLeafSize(Node* root){
if(root == NULL)
return 0;
if(root->left == NULL && root->right == NULL)
return 1;
return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
// 二叉树第k层节点个数
int BinaryTreeLevelKSize(Node* root, int k){
if(root == NULL)
return 0;
if(k == 1)
return 1;
return BinaryTreeLevelKSize(root->left,k - 1) + BinaryTreeLevelKSize(root->right,k - 1);
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(Node* root, BTDataType x){
if(root){
Node* node;
if(root->data == x)
return root;
node = BinaryTreeFind(root->left,x);
if(node)
return node;
else 
return BinaryTreeFind(root->right,x);
}
else
return NULL;
}
// 二叉树前序遍历
void preOrder(Node* root){
if(root){
  printf("%c",root->data);
  preOrder(root->left);
  preOrder(root->right);
}
)
// 二叉树中序遍历
void inOrder(Node* root){
if(root){
  inOrder(root->left);
  printf("%c",root->data);
  inOrder(root->right);
}
)
// 二叉树后序遍历
void postOrder(Node* root){
if(root){
  postOrder(root->left);
  postOrder(root->right);
  printf("%c",root->data);
}
)
// 层序遍历
void BinaryTreeLevelOrder(BTNode* root);
// 判断二叉树是否是完全二叉树
int BinaryTreeComplete(BTNode* root);

①二叉链,三叉链

// 二叉链
struct BinaryTreeNode
{
 struct BinTreeNode* _pLeft; // 指向当前节点左孩子
 struct BinTreeNode* _pRight; // 指向当前节点右孩子
 BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{
 struct BinTreeNode* _pParent; // 指向当前节点的双亲
 struct BinTreeNode* _pLeft; // 指向当前节点左孩子
 struct BinTreeNode* _pRight; // 指向当前节点右孩子
 BTDataType _data; // 当前节点值域
}

②.二叉树的分类

- 满二叉树:每个节点的度都为2的二叉树

在这里插入图片描述

//满二叉树度为0的节点 = 度为2的节点 + 1
N0 = N2 + 1
- 完全二叉树:除最后一个节点外,度都为2的二叉树(最后一层的节点必须是从左到右连续的)

在这里插入图片描述

2.堆(最大堆/最小堆才是堆):将所有元素按完全二叉树的顺序存储

  • 最小堆:根为最小值(子树的根也是最小值)
  • 最大堆:根为最大值(子树的根也是最大值)
  • 堆顶:整个树的根
//堆
typedef struct Heap
{
 HPDataType* _a;
 int _size;
 int _capacity; 
}Heap;
// 堆的构建
void HeapCreate(Heap* hp, HPDataType* a, int n);
// 堆的销毁
void HeapDestory(Heap* hp);
// 堆的插入
void HeapPush(Heap* hp, HPDataType x);
// 堆的删除
void HeapPop(Heap* hp);
// 取堆顶的数据
HPDataType HeapTop(Heap* hp);
// 堆的数据个数
int HeapSize(Heap* hp);
// 堆的判空
int HeapEmpty(Heap* hp);
// 对数组进行堆排序
void HeapSort(int* a, int n);

3.栈

4.遍历方式

①前序遍历-----先根节点,再左子树,再右子树(ABDCEF)

void preOrder(Node* root){
if(root){
  printf("%c",root->data);
  preOrder(root->left);
  preOrder(root->right);
}
)

②中序遍历-----先左子树,再根,再右子树(DBAECF)

void inOrder(Node* root){
if(root){
  inOrder(root->left);
  printf("%c",root->data);
  inOrder(root->right);
}
)

③后序遍历-----先左子树,再右子树,再根节点(DBEFCA)

void postOrder(Node* root){
if(root){
  postOrder(root->left);
  postOrder(root->right);
  printf("%c",root->data);
}
)

在这里插入图片描述

  • 层序遍历-----从上到下,从左往右依次遍历
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值