二叉树链表的建立(先序遍历序列建立二叉树链表)
获取结点信息;按照二叉树先序方式建立
需要读入空结点信息:# 先序序列ABCDEF
读入先序ABC##DE#G##F###
Status CreateBiTree(BiTree &T){
cin>>ch;
if(ch == "#") T=NULL;
else{
if(!T = new BiTNode())
exit(OVERFLOW);
T->data = ch;//生成根结点
CreateBiTree(T->lchild);//生成左子树
CreateBiTree(T->rchild);//生成右子树
}
return OK;
}
复制二叉树(先序遍历)
int Copy(BiTree T,BiTree &NewT){
if(T == NULL){
NewT=NULL; return 0;//源树为空树
}
else{
NewT = new BiTNode; NewT->data=T->data;
Copy(T->lchild,NewT->lchild);
Copy(T->rchild,NewT->rchild);
}
}
深度计算
递归左子树深度记作m,右子树深度记作n,对比两者中最大的值然后+1
int Depth(BiTree T){
if(T == NULL) return 0;//空树
else{
m=Depth(T->lchild);
n=Depth(T->rchild);
///递归计算深度↑
//判断谁大↓
if(m>n) return(m+1);
else
return (n+1);
}
}
结点总数计算
左子树结点+右子树结点+1
int NodeCount(BiTree T){
if(T == NULL)
return 0;
else
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
统计叶子结点个数
int LeadCount(BiTree T){
if(T==NULL)
return 0;
if(T->lchild == NULL && T->rchild==NULL)
return 1;
else
return LeadCount(T->lchild) + LeadCount(T->rchild);
}
线索二叉树
利用二叉树中的空指针域(遍历特殊的前驱和后继)
如果左孩子为空则将其改为指向前驱,如果右孩子为空则将其改为指向后继
此过程称为线索化
在结点中增设两个标志域ltag和rtag
ltag=0 lchild指向左孩子
ltag=1 lchild指向前驱
rtag=0 rchild指向右孩子
rtag=1 rchild指向后继
增加一个头结点,避免最后的结点悬空(遍历的第一个结点的lc和最后一个结点的rc都指向头结点)