数据结构--顺序表,链表,双向链表-CSDN博客
目录
[8.1 满二叉树](#8.1 满二叉树)
[8.2 完全二叉树](#8.2 完全二叉树)
[8.3 遍历二叉树](#8.3 遍历二叉树)
[8.3.1 前序(根 左子树 右子树)](#8.3.1 前序(根 左子树 右子树))
[8.3.2中序(左子树 根 右子树)](#8.3.2中序(左子树 根 右子树))
[8.3.3后序(左子树 右子树 根)](#8.3.3后序(左子树 右子树 根))
二.树
7.树
7.1.1定义:是n个节点的有限集
7.1.2树的基本概念
根 : 一个特殊的节点,没有前驱节点
子树 :
节点 :
节点的度 :一个节点含有的子树的个数
叶子(终端节点) :度为0的节点
非终端节点(分支节点) :度不为0的节点
树的度 :最大的节点的度
双亲 :有一个节点含有子节点,这个节点称为其子节点的双亲
兄弟 :具有同一个父节点的节点
祖先 :从根到该节点所经分支上的所有节点
子孙 :以某节点为根的子树中任意一个节点都称为该节点的子孙
层次 :从根开始,根为第一层,根的节点是第二层,以此类推
堂兄弟 :双亲在同一层的节点
树的深度 :树中节点的最大层次
无序树 :
森林 :由m棵互不相交的树的集合
8.二叉树
8.1 满二叉树
8.2 完全二叉树
8.3 遍历二叉树
8.3.1 前序(根 左子树 右子树)
1 (2 (3 N N) N)(4(5 N N)(6 N N))
123456
8.3.2中序(左子树 根 右子树)
((N 3 N)2 N)1(N 5 N) 4 (N 6 N))
321546
时间复杂度:O(N)
空间复杂度:O(h)、
h是高度:[log(N),N]
8.3.3后序(左子树 右子树 根)
((N N 3) N 2) ((N N 5)(N N 6) 4) 1
325641
8.3.4层序
递归:1.子问题2.返回条件
8.4二叉树的实现和计算
8.4.1二叉树的声明
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int BTDataType;
typedef struct BinaryTreeNode
{
BTDataType data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}BTNode;
8.4.2扩容
BTNode* BuyNode(BTDataType x)
{
BTNode* node = (BTNode*)malloc(sizeof(BTNode));
if (node == NULL)
{
perror("malloc fail");
return NULL;
}
node->data = x;
node->left = NULL;
node->right = NULL;
return node;
}
8二叉树的初步创建
BTNode* CreatBinaryTree()
{
BTNode* node1 = BuyNode(1);
BTNode* node2 = BuyNode(2);
BTNode* node3 = BuyNode(3);
BTNode* node4 = BuyNode(4);
BTNode* node5 = BuyNode(5);
BTNode* node6 = BuyNode(6);
BTNode* node7 = BuyNode(7);
node1->left = node2;
node1->right = node4;
node2->left = node3;
node4->left = node5;
node4->right = node6;
node5->left = node7;
return node1;
}
8.4.5二叉树节点个数
// 二叉树结点个数
//void BTreeSize(BTNode* root)
//{
// static int size = 0;
// //printf("%p,%d\n", &size, size);
//
// if (root == NULL)
// return;
//
// ++size;
//
// BTreeSize(root->left);
// BTreeSize(root->right);
//}
8.4.6叶子节点个数
// 求叶子节点的个数
int BTreeLeafSize(BTNode* root)
{
if (root == NULL)
{
return 0;
}
if (root->left == NULL
&& root->right == NULL)
{
return 1;
}
return BTreeLeafSize(root->left)
+ BTreeLeafSize(root->right);
}
8.4.7二叉树的高度
int BTreeHeight(BTNode* root)
{
if (root == NULL)
return 0;
int leftHeight = BTreeHeight(root->left);
int rightHeight = BTreeHeight(root->right);
return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}
8.4.8二叉树第k层结点个数
int BTreeLevelKSize(BTNode* root, int k)
{
assert(k > 0);
if (root == NULL)
return 0;
if (k == 1)
return 1;
return BTreeLevelKSize(root->left, k - 1)
+ BTreeLevelKSize(root->right, k - 1);
}
树不能轻易用assert(),因为树里面一定有空。