二叉树重点算法 归纳总结

设二叉树的存储结构为二叉链表

题:

1.统计二叉树中度为0的结点个数

2.统计二叉树中度为1的结点个数

3.统计二叉树中度为2的结点个数

4.统计二叉树的高度

5.统计二叉树的宽度

6.从二叉树中删去所有叶结点

7.计算指定结点*p所在层次

8.计算二叉树中各结点的最大元素值

9.交换二叉树中每个结点的两个子女

10.用先序遍历输出一棵二叉树中所有结点的数据值以及结点所在的层次

存储结构


typedef struct BiTNode{ 
    char data; 
    struct BiTNode *lchild,*rchild; 
}BiTNode,*BiTree;

 

1.统计二叉树中度为0的结点个数

int NodeCounter(BiTree T){
    int i = 0;
    if(T==NULL)        //空树,则退出。
    
    {
        return false;
    }

    else if(T->lchild==NULL&&T->rchild!=NULL || T->rchild==NULL && T->lchild!=NULL)
    {
        return i + NodeCounter(T->lchild) + NodeCounter(T->rchild);
    }
}

2.统计二叉树中度为1的结点个数

int NodeCounter(BiTree T){
    int i = 0;
    if(T==NULL)        //空树,则退出。
    
    {
        return false;
    }

    else if(T->lchild==NULL&&T->rchild!=NULL || T->rchild==NULL && T->lchild!=NULL)
    {
        return i + NodeCounter(T->lchild) + NodeCounter(T->rchild);
    }
}

3.统计二叉树中度为2的结点个数

int NodeCounter(BiTree T){
    int i = 0;
    if(T==NULL)        //空树,则退出。
    
    {
        return false;
    }

    else if(T->lchild!=NULL && T->rchild!=NULL)
    
    {
        return i + NodeCounter(T->lchild) + NodeCounter(T->rchild);
    }

}

4.统计二叉树的高度

算法一:层次遍历二叉树,最大层次即为二叉树的高度;
算法二:采用递归算法,求二叉树的高度。
int BT_level_depth(BiTree T) 
{ 
    if(!T) 
        return 0; 
    BiTree p=T,Q[100]; 
    int front=-1,rear=-1,last=0,level=0; 
    Q[++rear]=p; 
    while(frontlchild) 
            Q[++rear]=p->lchild; 
        if(p->rchild) 
            Q[++rear]=p->rchild; 
        if(front==last) 
        { 
            last=rear; 
            level++;               //层次+1 
        } 
    } 
    return level; 
}
int max1=0;//树高 
int BT_depth1(BiTree T,int depth) 
{ 
    if(T) 
    { 
        if(T->lchild) 
            BT_depth1(T->lchild,depth+1); 
        if(T->rchild) 
            BT_depth1(T->rchild,depth+1); 
    } 
    if(depth>max1)    
        max1=depth; 
    return depth; 
}

5.统计二叉树的宽度

void Width(BiTree T,int deep){
    if(T==NULL) return ;
    else{
        s[deep]++;
        Width(T->lchild,deep++);
        Width(T->rchild,deep++);
    }
}

//通过层次遍历,访问各层结点,并在遍历时,在数据域标记当前层数,层数被标记最多的则为最大宽度。
void Width(BiTree T){
    InitQueue(Q);
    if(T)
    {
        EnQueue(Q,T);
    }
    while(!IsEmpty(Q)){
        DeQueue(Q,T);
        visit(T);                //标记  
        if(T->lchild!=NULL)
            {
                EnQueue(Q,T->lchild);
                depth++;
            }
        if(T->rchild!=NULL)
            {
            EnQueue(Q,T->rchild);
             depth++;
            }
        }
    for(i=0;i

未完待续....

你可能感兴趣的:(算法)