树与二叉树操作(一)

非递归求二叉树的高度

void BiDepth(BiTree &T){
    BiTree bit;
    int last=0,level=0;
    Queue q;
    q.rear=-1;
    q.front=-1;
    if(!T){
        return ;
    }
    q.rear++;
    q.b[q.rear]=T;
    while(q.front<q.rear){
        q.front++;
        bit=q.b[q.front];
        if(bit->lchild){
            q.rear++;
            q.b[q.rear]=bit->lchild;
        }
        if(bit->rchild){
            q.rear++;
            q.b[q.rear]=bit->rchild;
        }
        if(last==q.front){
            level++;
            last=q.rear;
        }
    }
    printf("二叉树的高度:%d\n",level);
}

 

自下而上,自右而左层次遍历二叉树

void DeLeveLOrder(BiTree &T){
    Stack s;
    Queue q;
    s.top=-1;
    q.front=-1;
    q.rear=-1;
    BiTree bit;
    q.rear++;
    q.b[q.rear]=T;
    if(!T){
        return ;
    }
    while(q.front<q.rear){
        q.front++;
        bit=q.b[q.front];
        s.top++;
        s.a[s.top]=bit;
        if(bit->lchild){
            q.rear++;
            q.b[q.rear]=bit->lchild;
        }
        if(bit->rchild){
            q.rear++;
            q.b[q.rear]=bit->rchild;
        }
    }
    while(s.top!=-1){
        bit=s.a[s.top];
        visit(bit);
        s.top--;
    }
}

判断是否为一棵完全二叉树

void CompleteTree(BiTree &T){
    Queue q;
    q.front=-1;
    q.rear=-1;
    BiTree bit;
    int flag=1;
    if(!T){
        return ;
    }
    q.rear=q.rear+1;
    q.b[q.rear]=T;
    while(q.front<q.rear){
        q.front++;
        bit=q.b[q.front];
        if(bit){
            q.rear++;
            q.b[q.rear]=bit->lchild;
            q.rear++;
            q.b[q.rear]=bit->rchild;
        }
        else{
            while(q.front<q.rear){
                q.front++;
                bit=q.b[q.front];
                if(bit){
                    flag=0;
                }
            }
        }
    }
    if(flag==0){printf("不是完全二叉树\n");}
    else{printf("是完全二叉树\n");}
}

先序遍历打印第k个节点的值

void PreSerch(BiTree &T,int k){
    if(T){
        i=i+1;//全局变量i控制递归结次数
        if(i==k){
            printf("%c",T->data);
            j=1;
        }
        if(j==1){return ;}//全局变量j控制递归结束
        PreSerch(T->lchild,k);
        PreSerch(T->rchild,k);
    }
}

 

 查询一个节点的全部祖先节点

思想:采用后序遍历

typedef struct{
    BiTree t;
    int tag;//tag=0左子女被访问,tag=1有子女被访问
}stack1;
void SearchPar(BiTree &T,ElemType x){
    stack1 s1[MAXSIZE];
    int top=-1;
    BiTree bit=T;
    while(bit!=NULL||top!=-1){
        while(bit!=NULL&&bit->data!=x){
            s1[++top].t=bit;
            s1[top].tag=0;
            bit=bit->lchild;//向左子树遍历
        }
        if(bit!=NULL&&bit->data==x){
            printf("节点的祖先为:");
            for(int k=0;k<=top;k++){
                printf("%c ",s1[k].t->data);
            }
            exit(1);//找到祖先后结束
        }
        while(top!=-1&&s1[top].tag==1){
            top--;//退栈
        }
        if(top!=-1){
            s1[top].tag=1;
            bit=s1[top].t->rchild;//向右子树遍历
        }
    }
}

 

求二叉树的带权路径长度

 

void WorkWPL(BiTree &T){
    Queue q;
    BiTree bit;
    int depth=0;
    int lastnode=0;//当前层的最后一个节点的位置
    int number=0;
    q.front=-1;
    q.rear=-1;
    if(!T){
        return;
    }
    q.rear++;
    q.b[q.rear]=T;
    depth=depth+1;
    while(q.front<q.rear){
        q.front++;
        bit=q.b[q.front];
        if(bit->lchild==NULL&&bit->rchild==NULL){
            number=bit->data*depth+number;
        }
        if(bit->lchild){
            q.rear++;
            q.b[q.rear]=bit->lchild;
        }
        if(bit->rchild){
            q.rear++;
            q.b[q.rear]=bit->rchild;
        }
        if(q.front==lastnode){
            lastnode=q.rear;
            depth=depth+1;
        }
    }
    printf("二叉树的带权路径为:%d\n",number);
}

 

求二叉树的宽度(二叉树节点最多一层的节点数)

void BiWidth(BiTree &T){
    Queue q;
    q.rear=-1;
    q.front=-1;
    int lastnode=0;//每一层最后一个节点
    int width;
    int number=0;//记录每一层的节点
    BiTree bit;
    if(!T){
        return ;
    }
    q.b[++q.rear]=T;
    width=1;
    while(q.front<q.rear){
        bit=q.b[++q.front];
        number=number+1;
        if(bit->lchild){
            q.b[++q.rear]=bit->lchild;
        }
        if(bit->rchild){
            q.b[++q.rear]=bit->rchild;
        }
        if(q.front==lastnode){
            lastnode=q.rear;
            if(number>width){
                width=number;
            }
            number=0;
        }
    }
    printf("二叉树的宽度:%d\n",width);
}

 

转载于:https://www.cnblogs.com/Yshun/p/11296331.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值