一、二叉树
参考书(《数据结构(C语言)》–严蔚敏等编著,清华大学出版社);
1、二叉树的特点
1、是另一种树型结构;
2、每个节点至多有两棵子树(即二叉树不存在度大于2的节点);
3、二叉树的子树有左右之分,且次序不能任意颠倒;
2、二叉树的重要性质
- 性质1
在二叉树的第i层上至多有2^(i-1)个节点(i>=1); - 性质2
深度为k的二叉树至多有2^k-1个节点(k>=1); - 性质3
对任何一棵二叉树T,如果其叶子结点个数为N,度为2的节点个数为n,则一定满足N=n+1; - 性质4
具有n个节点的完全二叉树的深度为log2(n)(取最小整数)+1;
3、二叉树的建立与遍历(递归算法)
先序递归遍历
基本思想:
若二叉树为空,则空操作,否则:
1、先访问根结点;
2、再先序遍历左子树;
3、最后再先序遍历右子树;
4、即根—左---右;
中序递归遍历
基本思想:
若二叉树为空,则空操作,否则:
1、先中序遍历左子树;
2、再访问根结点;
3、最后再中序遍历右子树;
4、即左—根---右;
后序递归遍历
基本思想:
若二叉树为空,则空操作,否则:
1、先后序遍历左子树;
2、再后序遍历右子树;
3、最后再访问根结点;
4、即左—右---根;
相关代码:
#include "stdio.h"
#include "stdlib.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef char TElemType;
typedef struct BiNode {
TElemType data; //数据域
struct BiNode *lchild, *rchild; //左右孩子指针
} BiNode, *BiTree;
Status CreateBiTree(BiTree &T);
//构造二叉链表的二叉树T
Status CreateBiTree(BiTree &T) {
//按 先序次序输入二叉树中节点的值,#代表空树
char ch;
scanf("%c",&ch);
if(ch == '#') T=NULL;
else {
if(!(T = (BiNode *)malloc(sizeof(BiNode)))) exit(OVERFLOW);
T->data = ch; //生成树根节点
CreateBiTree(T->lchild); //构造左子树
CreateBiTree(T->rchild); //构造右子树
}
return OK;
}
Status PreOrder(BiTree T);
//先序遍历二叉树(递归)
Status PreOrder(BiTree T) {
if(T == NULL) return ERROR;
if(T) {
printf("%c",T->data); //先序遍历根
PreOrder(T->lchild); //先序遍历左子树
PreOrder(T->rchild); //先序遍历右子树
}
return OK;
}
Status InOrder(BiTree T);
//中序遍历二叉树(递归)
Status InOrder(BiTree T) {
if(T == NULL) return ERROR;
if(T) {
InOrder(T->lchild); //中序遍历左子树
printf("%c",T->data); //中序遍历根
InOrder(T->rchild); //中序遍历右子树
}
return OK;
}
Status PostOrder(BiTree T);
//后序遍历二叉树(递归)
Status PostOrder(BiTree T) {
if(T==NULL) return ERROR;
if(T) {
PostOrder(T->lchild); //后序遍历左子树
PostOrder(T->rchild); //后序遍历右子树
printf("%c",T->data); //后序遍历根
}
return OK;
}
int main(void) {
BiTree T;
CreateBiTree(T);
PreOrder(T);
printf("\n");
InOrder(T);
printf("\n");
PostOrder(T);
return OK;
}
/*
测试输入:ABC##D##E##
预期输出:
ABCDE
CBDAE
CDBEA
*/
实现:
先序建立初始二叉树为:ABC##D##E##
进行先序,中序,后序遍历后的值为: