[二叉树算法]先序中序后序遍历 算法应用总结

//先序遍历下的第k个结点 
int preorder(BTNode *t,int k,int n){
    int result;
    if(t==null) return 0;
    if(n==k) return t->data;
    result=preorder(t->lchild,k,n+1);
    if(result!=0) return result;
    else{
        return preorder(t->rchild,k,n+1);
    }
}
//先序中序 非递归
//中序遍历下的第k个结点
//中序遍历的第k个结点 
int count=0;
BTNode InOrder(BTNode *t,int k,int n){
    if(t==null && k<0) return null;
    BTNode target=null;
    if(t->lchild!=null){
        target=InOrder(t->lchild,k,n+1);
    }
    count++;
    if(target==null){
        if(count==k){
            target=t;
            return target;
        }
    }
    if(target==null && t->rchild!=null){
        target=InOrder(t->rchild,k,n+1);
    }
    return target;
}
//求二叉树中值为x的层号 
void NodeLevel(BTNode *t,int x,int &h,int temp_h){//当前层次
    if(t==null) h=0;
    else if(t->data==x) h=temp_h;
    else{
        Node7h(t->lchild,x,h,temp_h+1);
        if(h==0){
            NodeLevel(t->rchild,x,h,temp_h+1);
        }
    }
}
//删除一颗二叉树
void deleteTree(BTNode *t){
    if(t==null) return;
    else{
        deleteTree(t->lchild);
        deleteTree(t->rchild);
        free(t);
    }
}
//交换左右子树 
void swapChild(BTNode *t,BTNode *t1){
    if(t==null) t1=null;
    else{
        t1=(BTNode*)malloc(sizeof(BTNode));
        t1->data=t->data;
        swapChild(t->lchild,t1->rchild);
        swapChild(t->rchild,t1->lchild);
    }
}
//非递归 不新建结点
void swapChild(BTNode *t){
    if(t==null) return;
    InitStack(S);
    push(&s,t);
    BTNode *p;
    while(!isEmpty(s)){
        t=pop(&s);
        p=t->lchild;
        t->lchild=t->rchild;
        t->rchild=p;
        if(t->rchild!=null){
            push(&s,t->rchild);
        }
        if(t->lchild!=null){
            push(&s,t->lchild);
        }
    }
}
posted @ 2019-12-25 10:50  ZzUuOo666  阅读(447)  评论(0编辑  收藏  举报