目录
树
树的定义:一棵树是若干个结点的集合,它由唯一的根结点与若干互不相交的子树组成。其中每棵子树也是由唯一的根结点与若干个互不相干的子树构成。树的定义是递归的。
结点的度:结点拥有子树的个数
叶结点:结点度为零的结点
二叉树
二叉树:属于树,且满足:1)每个节点至多两个子树。2)二叉树是有序的,左右子树不能颠倒。
性质:1)二叉树第n层结点数至多为。2)深度为n的二叉树结点最多为-1。
满二叉树
满二叉树:属于二叉树,且满足:1)除了叶结点,其他结点均有左右孩子。2)叶结点都在二叉树的最底层,且叶结点数为该层的最大值。如下则为一个满二叉树例子:
完全二叉树
完全二叉树:属于二叉树,并且满足,如果对其结点按照“从上往下,从左向右”编号后与满二叉树的结点编号相同。则属于完全二叉树,否则为非完全二叉树。
ps:有关二叉树结点的运算,需要知道二叉树的总结点数=总分支数+1,除了根结点,其他每个结点都对应唯一一个指向自己的分支。
二叉树的链式存储
left | val | right |
typedef struct BTNode{
int val
struct BTNode *left *right;
}BTNode,*BiTNode
二叉树的遍历
先序遍历(访问根结点→先序遍历左子树→先序遍历右子树)
void PreOrder(BTNode *t){
if(t!==NULL){
visit(t->val);
PreOrder(t->left);
PreOrder(t->right);
}
}
中序遍历(中序遍历左子树→访问根结点→中序遍历右子树)
void PreOrder(BTNode *t){
if(t!==NULL){
PreOrder(t->left);
visit(t->val);
PreOrder(t->right);
}
}
后序遍历(后序遍历左子树→后序遍历右子树→访问根结点)
void PreOrder(BTNode *t){
if(t!==NULL){
PreOrder(t->left);
PreOrder(t->right);
visit(t->val);
}
}
层次遍历(第一步:初始化队列,将根结点入队。第二步:若队列不空,则队列头结点p出队,若p左孩子不空则入队,右孩子不空则入队。第三步:循环第二步,队列为空结束)
void LevelOrder(BTNode *t){
if(t==NULL) return 0;
BTNode *p;
queue<BTNode *> Q;
Q.push(t);//根结点入队
while(!Q.empty()){//队列不为空继续执行
p=Q.front();
Q.pop();
visit(p->val)//访问结点
if(p->left!=NULL) Q.push(p->left);//结点左孩子不为空则入队
if(p->right!=NULL) Q.push(p->right)//结点右孩子不为空则入队
}
}