数据结构-arithmetic二叉树

2017年学习的数据结构作的笔记,一些算法思想(伪代码实现)在日常学习中仍显得很重要,很多很多,在此记录整理不断补充,反复看反复理解反复记忆,加油!

1、二叉树先序遍历递归(recursion)算法

void preOrderRecursion(BiTree T)
{
    if(T!=Null)
    {
        visit(*T);//调用visit()函数
        preOrder(T->lchild);//先序遍历左子树
        preOrder(T->rchild);//先序遍历右子树
    }
}

2、二叉树先序遍历非递归算法(用栈实现)

void preOrderNoRecursion(BiTree T)
{
    //定义一个栈s并初始化
    initStack(s);
    push(s,Null);
    //p指针指向根节点
    p=T;
    while(p!=Null)
    {
        while(p!=Null)
        {
            visit(*p);
            if(p->rchild!=Null)
                push(s,p->rchild);//p的右孩子入栈
            p=p->lchild;//p指向当前结点的左孩子
        }
        pop(s,p);
    }
}

3、二叉树中序遍历递归算法

void inOrderRecursion(BiTree T)
{
    if(T!=Null)
    {
        inOrder(T->lchild);
        visit(*T);
        inOrder(T->rchild);
    }
}

4、二叉树中序遍历非递归算法

void inOrderNoRecursion(BiTree T)
{
    //定义一个栈s并初始化
    initStack(s);
    push(s,Null);
    //p指针指向根节点
    p=T;
    while(p!=Null)
    {
        push(s,p);
        p=p->lchild;
    }
    pop(s,p);
    while(p!=Null)
    {
        visit(*p);
        p=p->rchild;
        while(p!=Null)
        {
            push(s,p);
            p=p->lchild;
        }
        pop(s,p);
    }
}

5、二叉树层序遍历非递归算法

void levelOrder(BiTree T)
{
    if(T!=Null)
    {
        initQueue(Q);
        enQueue(Q,T);
        while(!QueueEmpty(Q))
        {
            deQueue(Q,p);
            visit(*p);
            if(p->lchild!=Null)
                enQueue(Q,p->lchild);
            if(p->rchild!=Null)
                enQueue(Q,p->rchild);
        }
    }
}

6、销毁一棵二叉树

void freeBiTree(BiTree p)
{
    if(p!=Null)
    {
        freeBiTree(p->lchild);//清空左子树
        freeBiTree(p->rchild);//清空右子树
        free(p);//释放p指针,而不是根结点
    }
}
//左右子树清空,还剩根结点处理
status destroyBiTree(BiTree &T)
{
    freeBiTree(T);//调用左右子树清空函数,置空了T树的左右子树
    T=Null;//根结点置空
    return Ok;
}

7、求二叉树高度

//方式一
void depth(BiTree T,int level,int &d)
{
    if(T!=Null)
    {
        if(level>d)
            d=level;
        depth(T->lchild,level+1,d);
        depth(T->rchild,level+1,d);
    }
}//调用前第3个实际参数赋0,调用时第2个实际参数赋1

//方式二
int depth(BiTree T)
{
    if(T==Null)
        return 0;
    else
        return 1+max(depth(T->lchild),depth(T->rchild));
}//高度=左右子树中最大层数+1(根结点)

8、判断两棵二叉树是否相似

status similar(BiTree B1,BiTree B2)
{
    if(B1==Null&&B2==Null)
        return TRUE;//B1,B2都空,相似
    else if(B1==Null || B2==Null)
        return FALSE;//一个空另一个不空,不相似
    else
        return similar(B1->lchild,B2->rchild)&&similar(B1->rchild,B2->rchild);
}//B1,B2左右子树相似

9、二叉树叶子结点的数量

int leaf(BiTree T)
{
    if(T==Null)
        return 0;//空树没有叶子
    else if(T->lchild==Null&&T->rchild==Null)
        return 1;//只有根结点,也就是一个叶子
    else
        return leaf(T->lchild)+leaf(T->rchild);//叶子数=左右子树叶子数量之和
}

10、删除二叉树中所有以根值是x的子树

void release(BiTree &T,TElemType x)
{
    if(T!=Null)
    {
        //若根结点的值就是x,则删除整个二叉树
        if(T->data==x)
        {
            freeBiTree(T);
            T=Null;
        }
        else
        {
            release(T->lchild,x);
            release(T->rchild,x);
        }
    }
}

11、二叉树每个结点增加一个DescNum域,用以存放该结点的子孙(descendent)数目

void descendent(BiTree T)
{
    if(T!=Null)
    {
        T->DescNum=0;
        if(T->lchild!=Null)
        {
            descendent(T->lchild);
            T->DescNum += T->lchild->DescNum+1;
        }
        if(T->rchild!=Null)
        {
            descendent(T->rchild);
            T->DescNum += T->rchild->DescNum+1;
        }
    }
}

12、前序遍历法和中序遍历法建立二叉链表

void create(TElemType preOrder[],int low1,int high1,TElemType inOrder[],int low2,int high2,BiTree &T)
{
    if(low1>high1)  T=Null;
    else
    {
        T=(BiTree)malloc(sizeof(BiTNode));
        T->data=preOrder[low1];
        i=low2;
        while(inOrder[i]!=preOrder[low1])
            i++;
        create(preOrder,low1,low1-low2+i,inOrder,low2,i-1,T->lchild);
        create(preOrder,low1-low2+i+1,high1,inOrder,i+1,high2,T->rchild);
    }
}

13、按树状打印二叉链表存储的二叉树

void printBiT(BiTree T,int column)
{
    if(T!=Null)
    {
        printBiT(T->rchild,column+1);
        for(int i=1;i<column;i++)
        {
            printf(" ");//空格键
            printf(T->data);
            printf("\n");
            printBiT(T->lchild,column+1);
        }
    }
}//调用时第2个实际参数为1

14、表达式(a-(b+c))*(d/e)以中序遍历法存储二叉树中,*符号为根结点,求值

int comp(BiTNode *p)
{
    //A=(a-(b+c))作为左子树,B=(d/e)作为右子树
    int A,B;
    if(p!=Null)
    {
        if(p->lchild!=Null&&p->rchild!=Null)
        {
            A=comp(p->lchild);
            B=comp(p->rchild);
            return op(A,B,p->data);//采用后序遍历法,求出左右子树值,最后和根结点的值进行运算
        }
        else
            return P->data-'0';//字符型转化为整数型
    }
    else
        return 0;
}

15、各序列遍历法求第k个结点的值

//先序遍历
int n=0;//定义全局变量n,将结点计数初值记为0
void trave(BiTNode *p,int k)
{
    if(p!=Null)
    {
        //①
        ++n;//当第1次来到1个结点时计数,表示第n个结点
        if(k==n)//当第1次来到1个结点的时候进判断,看这个结点是否为先序序列中第k个结点
        {
            printf(p->data);
            return;
        }
        //如果不是,继续左右子树找k结点
        //②
        trave(p->lchild,k);
        //③
        trave(p->rchild,k);
    }
}
//中序遍历
int n=0;
void trave(BiTNode *p,int k)
{
    if(p!=Null)
    {
        //②
        trave(p->lchild,k);
        //①
        ++n;
        if(k==n)
        {
            printf(p->data);
            return;
        }
        //③
        trave(p->rchild,k);
    }
}
//后序遍历
int n=0;
void trave(BiTNode *p,int k)
{
    if(p!=Null)
    {
        //②
        trave(p->lchild,k);
        //③
        trave(p->rchild,k);
        //①
        ++n;
        if(k==n)
        {
            printf(p->data);
            return;
        }
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值