chap9homework

本章作业:9.31,9.33,9.35,9.38

9.31 试编写一个判别给定二叉树是否为二叉排序树的算法, 设此二叉树以二叉链表作为存储结构,且树中节点的关键字均不同.

int IsSearchTree(const BTNode *t){
    if(!t) //空二叉树情况
        return 1;
    else if(!(t->lchild) && !(t->rchild))//左右子树都无情况
        return 1;
    else if((t->lchild) && !(t->rchild)){//只有左子树情况
        if(t->lchild->data>t->data)
            return 0;
        else
            return IsSearchTree(t->lchild);
    }
    else if((t->rchild) && !(t->lchild)){//只有右子树情况
        if(t->rchild->datadata)
            return 0;
        else
            return IsSearchTree(t->rchild);
    }
    else{ //左右子树全有情况
        if((t->lchild->data>t->data) ||(t->rchild->datadata))
            return 0;
        else
            return IsSearchTree(t->lchild) && IsSearchTree(t->rchild);
    }
}
中序遍历二叉树, 然后判断输出的中序序列是否有序.
    int pre = -99999; // 上一个访问的节点 初始化为一个最小值
    bool IsBST(BiTree T){
        if(T!=NULL){
            IsBST(T->lchild);
            int cur = T->data;
            if(currchild);
        }
        return true;
    }

9.33 编写递归算法, 从大到小输出给定二叉排序树中所有关键字不小于x的数据元素.

将中序遍历改为, 
    1) 访问右子树
    2) 访问根节点
    3) 访问左子树
当遇到一个小于x的元素时就停止输出.
    Status BstX(BiTree T){
        if(T){
            BstX(T->rchild);
            if(T->data >= x) cout << T->data << ends;
            else return;
            BstX(T->lchild);
        }
    }

9.35 假设二叉排序树以后继线索链表作存储结构, 编写输出该二叉树中所有大于 a 且小于 b 的关键字的算法.

void InOrder_Thr(BiThrTree T, int a, int b){
    P=T->lchild;
    while(P != T){
        while(p->LTag==Link) p=p->lchild;
        if(P->data >a && P->data data);
        while(p->RTag==Thread && p->rchild!=T){
            p=p->rchild;
            if(P->data >a && P->data data);            
        }
        p=p->rchild;
    }
}

9.38 编写一算法, 将两颗二叉排序树合并为一颗二叉排序树.

遍历第二棵树,把其中每个元素依次插入到第一个二叉树
void Insert_Node(Bitree &T,  BTNode *S){        //把树结点S插入到T的合适位置上
    if(S==null||T==null)   return ;       //合法性:这里不作操作
    if(S->data > T->data) {
        if(!T->rchild)  T->rchild=S;             //t右指针指向s所指结点
        else  return Insert_Node(T->rchild,S);
    }
    else if(S->data < T->data) {
        if(!T->lchild)  
            T->lchild=S;
        else 
            return  Insert_Node(T->lchild,S);
    }
    S->lchild=NULL;  //插入的新结点必须和原来的左右子树断绝关系
    S->rchild=NULL;  //否则会导致树结构的混乱
}

Author: Cherrison
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Cherrison !
评论
 Previous
chap9talk chap9talk
第九章 查找1、证明二叉排序树结点的中序序列就是二叉排序树结点按关键字码值排序的序列。二叉树的中序遍历,其将每一层分成了三部分,(左子树所有节点) (根节点) (右子树所有节点)而对于一个二叉排序树, 它左子树上所有节点均小于根节点, 右子
2019-06-19 Cherrison
Next 
小海心灵-介绍文档 小海心灵-介绍文档
小海心灵-介绍文档 –中国海洋大学-Psyche团队作品 一. 小程序简介1. 简要介绍1) 简介2) 产生背景2. 交互设计1) 设计思路2) 界面展示3. 使用说明二. 技术开发方案
2019-06-01 Cherrison
  TOC