第六章二叉树和树结构算法设计技术
二叉链表存储结构
typedef struct{
datatype data;
Bnode *lchild,*rchild;
}Bnode;
typedef Bnode *bitree;//结点指针类型
6.2遍历算法的简单变化及应用
6.2.1二叉树遍历算法
//先序遍历
void preorder(Bnode *T){
if(T!=NULL){
visit(T);
preorder(T->lchild);
preorder(T->rchild);
}
}
6.2.2遍历算法的简单变化
例6.1 设计算法按先序方式输出二叉树叶子节点的值
void preorder(Bnode *T){
if(T!=NULL){
if(T->child==NULL&&T->rchild==NULL)
cout<<T->data;
preorder(T->lchild);
preorder(T->rchild);
}
}
// 相关习题
// 设计算法以中序输出度为2的结点值
void inorder(Bnode *T){
if(T!=NULL){
inorder(T->lchild);
if(T->lchild!=NULL&&T->rchild!=NULL)
cout<<T->data;
inorder(T->rchild);
}
}
例6.2设计算法求二叉树T的结点数
void inorder(Bnode*T){
if(T!=NULL){
inorder(T->lchild);
n++;
inorder(T->rchild);
}
}
例6.3求度为2的结点数
void inorder(Bnode*T){
if(T!=NULL){
inorder(T->lchild);
if(T->lchild!=NULL&&T->rchild!=NULL)
n++;
inorder(T->rchild);
}
}
例6.4设计算法以后序方式输出前K个结点
void postorder(Bnode *T){
if(T!=NULL){
postorder(T->lchild);
postorder(T->rchild);
n++;
if(n<=K)
cout<<T->data;
}
}
例6.5求两个整数的最大公因子
int hcf(int m,int n){
if(n==0) return m;
else return hcf(n,m%n);
}
例6.6利用递归求二叉树结点数
//整数函数形式
int nodes(Bnode* T){
if(T==NULL) return 0;
return 1+nodes(T->lchild)+nodes(T->rchild);
}
例6.7求结点数并赋予参数n
//以参数返回形式
void nodes(Bnode *T,int &n){
int n1,n2;
if(T==NULL) n=0;
else{
n1=nodes(T->lchild,n);
n2=nodes(T->rchild,n);
n=n1+n2+1;
}
}
例6.8将结点数累加到n中
void nodes(Bnode*T,int &n){//调用前n清零
if(T!=NULL){
nodes(T->lchild,n);
nodes(T->rchild,n);
n++;
}
}
例6.9将结点数累加到全程变量n中
void nodes(Bnode *T){//调用算法前n清零
if(T!=NULL){
nodes(T->lchild);
n++;
nodes(T->rchild);
}
}
例6.10将结点数赋给n
void nodes(Bnode *T){
int n1;
if(T==NULL) n=0;
else{
nodes(T->lchild);
n1=n;
nodes(T->rchild);
n=n+n1+1;
}
}
例6.11求二叉树的叶子结点数据
int leaf(Bnode *T){
if(T==NULL) return 0;
else{
if(T->rhicld!=NULL&&T->lchild!=NULL)
return 1;
else
return leaf(T->lchild)+leaf(T->rchild);
}
}
例6.12求二叉树的高度
//整数函数形式
int high(Bnode *T){
if(T==NULL) return 0;
else return max{high(T->lchild),high(T->rchild)}+1;
}
//带变参形式
void high(Bnode *T,int &h){
int hl,hr;
if(T==NULL) h==0;
else{
high(T->lchild,hl);
high(T->rchild,h2);
h=max(hl,hr)+1;
}
}
例6.13释放所有结点的空间
void postorder(Bnode *T){
if(T!=NULL){
postorder(T->lchild);
postorder(T->rchild);
delete T;
}
}
例6.14判断是否为二叉排序树
void adj(Bnode *T,datatype prev,bool flag){//prev指明前驱的值 初始为INF
if(T!=NULL){
adj(T->lchild,prev,flag);
if(T->data<=prev){
flag=false;
return;
}
prev=T->data;
adj(T->rchild,prev,flag);
}
}
6.4树和森林的算法设计
//孩子兄弟表示法
typedef struct{
char data;
tnode *firstson,*nextbrother;
}tnode;
typedef tnode*tree;
//森林的先序遍历
void preorder(tnode*T){
if(T!=NULL){
visite(T);
preorder(T->firstson);
preorder(T->nextbrother);
}
}
//对一棵树的完整遍历
void preorder_tree(tnode*T){
if(T!=NULL){
visite(T);
preorder_tree(T->firstson);
}
}
//直接面向一颗树的遍历算法
void preorder_tree(tnode*T){
tnode *p;
if(T!=NULL){
visite(T);
p=T->firstson;
while(p!=NULL){
preorder_tree(p);
p=p->nextbrother;
}
}
}
例6.15求树或森林的叶子节点数
int leaf(tnode*T){
int S;
tnode P;
if(T==NULL) return 0;
else if(T->firstson==NULL)return 1;
else{
S=0;
p=p->nextbrother;
while(p!=NULL){
s=s+leaf(P);
p=p->nextbrother;
}
return s;
}
}
例6.16求树或森林的高度
int high(tnode*T){
int h;tnode *p;
if(T==NULL)return 0;
else{
p=T->firstson;h=0;
while(P!=NULL){
h=max{h,high(p)};
p=p->nextbrother;
return h+1;
}
}
}
6.5建立二叉树
例6.17设计算法以拓展二叉树先序作为输入构建二叉树
void create_tree(bitree *T){
char cin>>ch;
if(ch=='.')
T=NULL;
else{
T=new bnode; T->data=ch;
create_tree(T->lchild);
create_tree(T->rchild);
}
}
例6.18建立二分查找的判定树
void create(bitree &T,int low,int high){
int mid;
if(low>high) T=NULL;
else{
T=new bnode; int mid=(low+high)/2;
T->data=mid;
create(T->lchild,low,mid-1);
create(T->rchild,mid+1,high);
}
}
例6.19一颗完全二叉树顺序方式存储在数组A[1+n]中,设计算法构造该二叉链表
void create(bitree &T,int i){
if(i>n)T=NULL;
else{
T=new bnode; T->data=A[i];
create(T->lchild,2*i);
create(T->rchild,2*i+1);
}
}
例6.20用先序pre[n]和中序pin[n]构建二叉链表
void create(bitree &T,int i1,int i2,int k){
if(k<=0) T=NULL;
else{
T=new bnode; T->data=pre[i];
int m=pos(pre[i1],pin,i2);
int Llen=m-i2;
int Rlen=k-(Llen+1);
create(T->Lchild,i1+1,i2,Llen);
create(T->rchild,i1+Llen+1,m+1,Rlen);
}
}
例6.21将二叉链表按顺序存到数组A中
void trans(bitree &T,int i){
if(T!=NULL){
A[i]=T->data;
trans(T->lchild,2*i);
trans(T->rchild,2*i+1);
}
}