初识树及二叉树
// 一、树概念及结构
// 树是一种非线性的数据结构是有限个节点组成的有层次关系的集合。类似倒挂的树
// 有一个特殊的节点,叫做根节点
// (树+亲缘关系)
// 节点的度:一个节点含有的子树的个数
// ·叶节点或终端节点:度为零的节点;度不为零的是分支节点
// ·双亲节点或父节点:子节点的前一个节点
// ·孩子节点或子节点:一个节点含有的子树的根节点
// 兄弟节点:(亲兄弟)有同一个父节点的两个节点
// 树的度:树的最大节点的度
// 节点的层次:一般从第一层开始,但从第零层开始也行
// (空树和只有根节点的区分)
// (数组从零开始是为了方便计算,数组名是首元素地址,a[i]等价于*(a+i))
// ·高度/深度:树中节点的最大层次
// 堂兄弟节点:同一层的节点
// 祖先:从父节点到根节点都是祖先节点(都是直系亲属)
// 子孙节点
// 森林:互不相交的树组成的集合
//
// 任何一棵树都包含跟和N棵子树(N>=0)
// 树都是由递归定义的:将大问题拆解为小问题,小问题被拆解为更小的问题,但最后会被拆成一个
// 可被直接解决的问题
// 注意:树形结构中,子树之间不能有交集,否则就不是树形结构
// 除了根节点之外,每个节点有且仅有一个父节点
// 由N个节点的树,有(N-1)个新节点
//
//#define N 4 //明确告诉树的度
//struct TreeNode
//{
// int val;
// struct TreeNode* subs[N];
//};
//未明确告诉树的度
//struct TreeNode
//{
// int val;
// SepList subs;//顺序表内部存struct TreeNode*
//};
//左孩子右兄弟表示法
struct TreeNode
{
int val;
struct TreeNode* leftchild;
struct TreeNode* rightbrother;//无论一个父亲有多少个孩子,child都指向左边开始的第一个孩子
//若没有brother,则指向空
//因此找到所有孩子,只需要找到第一个孩子,然后以链表遍历的方式获取每个孩子节点
};
//TreeNode* parent;
// TreeNOde* cur = parent->leftchild;
// while(cur)
// {
// cur = cur->rightchild;
// }
// 二叉树的概念及结构
// 二叉树是树的子集,每个节点最多有两个孩子,有一个根节点,加上两棵左子树和右子树
// 特殊的二叉树——满二叉树和完全二叉树
// 满二叉树:每一层的每个节点的度都是二(除了叶子),h层的满二叉树共有2^h-1个节点
// 完全二叉树:共有h层,前(h-1)层都是满的,最后一层从左到右连续
// ——满二叉树可以认为是特殊的完全二叉树
//
//
//
// 二叉树的存储:
// leftchild data rightchild
// 完全二叉树的顺序存储:
// 逻辑结构:想象出来的(即二叉树的示意图);物理结构:内存中实实在在存在的
// 用数组存储完全二叉树,用数组下表来判断父子关系
// 假设父亲在数组中的下表:i
// 左孩子在数组中的下表:2*i+1
// 右孩子在数组中的下表:2*i+2
// 假设孩子在数组中的下标是:j
// 则父亲在数组中的下标是(j-1)/2
// ——因为存在取整的概念,所以奇数偶数没有区别
//
//
// 数据结构里有堆(堆排序)和栈(一头进出),C语言里也有堆和栈,这里堆和栈是内存区域划分
// 数据结构里的二叉树:
// 第一个条件:是完全二叉树;第二个条件:任何一个父亲>=孩子——大堆
// 是完全二叉树,任何一个父亲<=孩子——小堆
// 小堆不一定是升序,大队也不一定是降序,因为孩子们的大小关系未定
// 根是最小的或者最大的,可以用来找极值
// 给一个数组,判断是不是堆,
//