二叉树(BinaryTree)
二叉树的概念是非常的庞大,也是非常的多,小编在此总结完整知识体系
二叉树是一个有限的结点集合,这个集合或者为空,或者由一个根节点和两颗互不相交的称左子树和右子树的二叉树组成
注意:
- 度为2的树中至少有一个结点的度为2,而二叉树没有这种要求。
- 度为2的树不区分左、右子树,而二叉树是严格区分左、右子树的。
- 在一颗二叉树中,如果所有的分支结点都有左右子树,并且叶子结点都在二叉树的最下层,这样的二叉树称为满二叉树。
二叉树性质:
- 非空二叉树的叶子结点数等于双分支结点数加1。
- 非空二叉树的第i层上最多有2^i - 1个结点(i>=1)
- 高度为h的二叉树最多有2^h - 1 个结点(h>=1)
- 具有n个结点的完全二叉树的高度为[log2(n+1)]或[log2n]+1
二叉树的存储结构:
顺序存储结构:
typedef struct SqBiTree{
ElemType SqBiTree[MaxSize];
};
二叉树的链式存储结构:
typedef struct SqNode{
ElemType data;
struct SqNode *lchild;
struct SqNode *rchild;
};
二叉树的遍历:
补充:二叉树的遍历方式是根据存储方式来的,什么样的存储方式用不同的遍历方式结果都会不同
- 先序遍历(DLR)
- 中序遍历(DLR)
- 后序遍历(LRD)
层次遍历:
(二)树、森林、二叉树的转换
- 森林转树:
如下有三颗树,分别为2次树,1次树,和3次树,将他们添加到L的双亲结点下,称为结点L的孩子结点,森林就被转换成树了。
- 树转二叉树:
二叉树转树:
- 有二叉树如下:
连接之后:
- 还原如下:
二、二叉树的基本算法
为了演示方便,小编采用的是括号表示法(A(B,C))
- 创建树结构体:
typedef struct SqNode{
char data;
struct SqNode *lchild;
struct SqNode *rchild;
}BTNode;
- 创建二叉树算法:
void createBiTree(BTNode *&node , char *str){
BTNode *St[MaxSize] , *p; //创建顺序栈
int top = -1,k,j = 0; //栈顶指针以及str数组指针
char ch ;
node = NULL;
ch = str[j];
while(ch != '\0'){ //循环遍历str数值
switch(ch){
case '(':
top++;St[top] = p;k=1;break;
case ')':
top--;break;
case ',':k=2;break;
default: p = (BTNode *)malloc(sizeof(BTNode));
p->data = ch;
p->lchild = p->rchild = NULL;
if(node == NULL){
node = p;
}else{
switch(k){
case 1:St[top]->lchild = p;break;
case 2:St[top]->rchild = p;break;
}
}
}
j++;
ch = str[j];
}
}
- 输出二叉树算法:
//输出二叉树
void dispBtree(BTNode *b){
if(b!=NULL){
printf("%c",b->data);
if(b->lchild != NULL || b->rchild != NULL){
printf("(");
dispBtree(b->lchild);
if(b->rchild != NULL) printf(",");
dispBtree(b->rchild);
printf(")");
}
}
}
- 销毁二叉树算法:
//销毁二叉树
void destoryBTree(BTNode *&bnode) {
if(bnode != NULL) {
destoryBTree(bnode->lchild);
destoryBTree(bnode->rchild);
free(bnode);
}
}
- 查找指定结点算法:
//查找结点算法
BTNode *findNode(BTNode *bnode , char ch){
BTNode *p;
if(bnode == NULL){
//没有返回值了
return NULL;
}else if(bnode->data == ch){
return bnode; //找到这个结点直接返回
}else{
p = findNode(bnode->lchild,ch);
if(p != NULL){
return p;
}else{
return findNode(bnode->rchild,ch);
}
}
}
- 结果展示:(搜索M和搜索G元素)
搜索G元素