第六章二叉树和树结构算法设计技术

第六章二叉树和树结构算法设计技术

二叉链表存储结构

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);
    }
}
posted @ 2021-10-10 11:06  CNPolaris  阅读(92)  评论(0编辑  收藏  举报