树和二叉树
树是n个结点的有限集。
根——即根节点(没有前驱)
叶子——即终端结点(没有后继)
森林——即m棵不相交的树的集合
有序树,无序树
结点的度——结点挂接的子树数
树的度——所有结点度中的最大值
可以证明,所有树都能转为唯一对应的二叉树
二叉树的基本特点:
1.结点的度≤2
2.有序树
二叉树的性质:
1.在二叉树的第i层上至多有2^(i-1)个结点。
2.深度为k的二叉树至多有2^k-1个结点。
满二叉树,完全二叉树
满二叉树是完全二叉树的一个特例。
3.具有n个结点的完全二叉树的深度必为[log2(n)]+1。
二叉链表:
typedef struct BiNode{
TElemType data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
遍历二叉树:
先序遍历——先根再左再右
中序遍历——先左再根再右
后序遍历——先左再右再根
先序遍历实现:
Status PreOrderTraverse(BiTree T){
if(T==NULL) return OK;
else{
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
中序遍历实现:
Status PreOrderTraverse(BiTree T){
if(T==NULL) return OK;
else{
PreOrderTraverse(T->lchild);
cout<<T->data;
PreOrderTraverse(T->rchild);
}
}
后序遍历实现:
Status PreOrderTraverse(BiTree T){
if(T==NULL) return OK;
else{
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
cout<<T->data;
}
}
遍历算法的分析:
时间效率:O(n)
空间效率:O(n)
二叉树的建立:
void CreateBiTree(BiTree &T){
cin>>ch;
if(ch=='#') T=NULL;
else{
T=new BiNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
计算二叉树结点总数:
int NodeCount(BiTree T){
if(T=NULL) return 0;
else return NodeCount(T->lchild)+NodeCount(T->rchild);
}