如何将一般二叉树变为二叉排序树 c语言

作者&投稿:荀矩 (若有异议请与网页底部的电邮联系)
C++实现将一个已知的二叉树转化为二叉排序树~

通过以下代码获取文件大小,然后分配相应大小的内存,一次性读取文件到此内存就可以加快读取速度了。具体代码如下: #include #include int main () { FILE * pFile; long lSize; char * buffer; size_t result; /* 若要一个byte不漏地读入整个文件,只能采用二进制方式打开 */ pFile = fopen ("test.txt", "rb" ); if (pFile==NULL) { fputs ("File error",stderr); exit (1); } /* 获取文件大小 */ fseek (pFile , 0 , SEEK_END); lSize = ftell (pFile); rewind (pFile); /* 分配内存存储整个文件 */ buffer = (char*) malloc (sizeof(char)*lSize); if (buffer == NULL) { fputs ("Memory error",stderr); exit (2); } /* 将文件拷贝到buffer中 */ result = fread (buffer,1,lSize,pFile); if (result != lSize) { fputs ("Reading error",stderr); exit (3); } /* 现在整个文件已经在buffer中,可由标准输出打印内容 */ printf("%s", buffer); /* 结束演示,关闭文件并释放内存 */ fclose (pFile); free (buffer); return 0; }

typed RcdType TElemType;
void Insert_BST( BiTree &T, KeyType e )
{ // 在以T为根指针的二叉排序树中插入记录e
s=new BiTNode; // 生成新的结点
s->data=e; s->lchild=NULL; s->rchild=NULL; //新插入结点必为叶
if(!T) T=s; // 插入的结点为根结点
else {
p=T;
while( p) // 查找插入位置
if(e .keydata .key)
{ f=p; p=p->lchild; } // 应插入在左子树中
else
{ f=p; p=p->rchild; } // 应插入在右子树中
if(e.keydata.key) f->lchild=s;//插入为f所指结点的左子树根
else f->rchild = s; // 插入为f所指结点的右子树根
} //else
} // Insert_BST
void BSTSort( SqList &L )
{ // 利用二叉排序树对顺序表L进行排序
BiTree T=NULL; // 初始化二叉排序树为空树
for(i=1;i<L.length;++i)
Insert_BST( T,L.r[i]); // 按顺序表L构造二叉排序树
i=0;
InOrder(T,Output(T,L,i)); // 中序遍历二叉排序树
//通过函数指针引用Output,将排序记录由小到大输出至L.r[i]
} // BSTSort
其中函数Output的具体实现如下:
void Output(BiTree T, SqList &L, int &i )
{ L.r[++i]=T->data; }

完成。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>/* 定义结构体 */
typedef  int TypeData;
typedef struct stBiTreeNode 
{
    TypeData data;
    struct stBiTreeNode *lchild, *rchild;
}BITREENODE;/* 
* 函数功能:判断要插入的数据是否存在 
* 函数参数:root 根节点
            data 要查询的数据
            lastNode 如果没有找到,则返回查找最后一个节点
* 返回值: 0 存在 1 不存在 2 树是空树
*/int isDataAlreadyExist(BITREENODE* root, TypeData data,BITREENODE** lastNode)
{
    BITREENODE* temp = root;

    /* 如果根节点是空的,则直接返回 */
    if(!temp)
    {
        return 2;
    }

    while(1)
    {
        /* 如果存在直接返回 */
        if(temp->data == data)
        {
            return 0;
        }

        if(temp->data < data)
        {
            if(temp->rchild == NULL)
            {
                /* 把最后一个节点的地址返回出去 */
                (*lastNode) = temp;
                return 1;
            }
            temp = temp->rchild;
        }
        else
        {
            if(temp->lchild == NULL)
            {
                /* 把最后一个节点的地址返回出去 */
                (*lastNode) = temp;
                return 1;
            }
            temp = temp->lchild;
        }

    }
}/* 在二叉排序树中插入数据 */BITREENODE* createSortBiTree(BITREENODE* root,TypeData data)
{
    int ret = 0;
    BITREENODE* pLastNode = NULL;

    /* 判断要插入的数据是否存在 */
    ret = isDataAlreadyExist(root,data,&pLastNode);

    /* 如果已经存在了 */
    if(ret == 0)
    {
        return root;
    }

    /* 如果没有找到,就把这个插入 */
    if(ret == 1)
    {
        BITREENODE* pNewNode = (BITREENODE*)malloc(sizeof(BITREENODE));
        pNewNode->data = data;
        pNewNode->lchild = pNewNode->rchild = NULL;

        /* 插入到右孩子 */
        if(pLastNode->data < data)
        {
            pLastNode->rchild = pNewNode;
        }
        /* 插入到左孩子 */
        else if(pLastNode->data > data)
        {
            pLastNode->lchild = pNewNode;
        }

    }

    /* 根节点是空的,则新建一个根节点*/
    if(ret == 2)
    {
        BITREENODE* pNewNode = (BITREENODE*)malloc(sizeof(BITREENODE));
        pNewNode->data = data;
        pNewNode->lchild = pNewNode->rchild = NULL;

        root = pNewNode;
    }
    return root;
}/* 中序遍历该二叉排序树 */int inOrderBiTree(BITREENODE* root)
{
    if(root)
    {       
        inOrderBiTree(root->lchild);
        printf("%d ",root->data);
        inOrderBiTree(root->rchild);
    }
    return 0;
}

int main()
{
    BITREENODE* root = NULL;

    /* 在二叉排序树种插入数据 */
    root = createSortBiTree(root,20);
    root = createSortBiTree(root,30);
    root = createSortBiTree(root,10);
    root = createSortBiTree(root,25);

    inOrderBiTree(root);

    printf("
");
    return 0;
}



算法怎么学
则平均码长定义为: 使平均码长达到最小的前缀码编码方案称为C的最优前缀码。 Huffman编码的构造方法:先合并最小频率的2个字符对应的子树,计算合并后的子树的频率;重新排序各个子树;对上述排序后的子树序列进行合并;重复上述过程,将全部结点合并成1棵完整的二叉树;对二叉树中的边赋予0、1,得到各字符的变长编码...

完全二叉树用什么数据结构实现最合适,为什么?
一般的二叉树用带有两个指向自身结构类型变量的指针的多个结构体组成最合适。如果该二叉树不会变化,可以用数组实现,每个数组元素表示一个节点,因为是完全的,所以长度一定是2的n次方-1,n为树的深度,也可以很方便地算出某个元素与树根节点、父节点等的关系,因此不用指针反而可以减少存储开销及查询...

二叉树的性质的理解?
二叉树当中的结点只有度为0、1、2三种情况,度为0就是终端结点。构造二叉树的过程就是从原始结点开始“生长”结点的过程,初始状态下,原始结点就是终端结点,n0=1,n1=0,n2=0,每当一个原来的终端结点变成“1度结点”的时候只是把终端的位置向下移动了一点,n1++,不影响n0和n2,而每当一个原来...

树的后根遍历序列等同于该树对应的二叉树的( B ). A. 先序序列 B. 中...
树的后序遍历是指先依次后序遍历每棵子树,然后访问根结点。当树用二叉树表示法(也叫孩子兄弟表示法)存储时,可以找到唯一的一棵二叉树与之对应,我们称这棵二叉树为该树对应的二叉树。那么根据这个法则可知,树的后序遍历序列等同于该树对应的二叉树的中序遍历。从二叉树的递归定义可知,一棵非空...

树总结(二)平衡二叉树
举例: 用 [3,2,1,4,5,6,7,10,9,8] 这个数组组成一个平衡二叉树。下图图1 中。已经插入 3 个数,此时发现根结点的平衡因子变为了 2。已经是最小不平衡子树了。所以需要右转( 左子树 - 右子树 = 正数;顺势转旋转 )。如下图图2。然后插入 4 数字。如下图图3。此时的平衡因子...

构造平衡二叉树
53、37,路径形态为先向右走再向左走,于是24、53和37进行先右后左双旋转:第一步:将37、53向右旋转,37上,53变为37的右子树,48交给53成为53的左子树 第二步:将24、37向左旋转,37上,24变成37的左子树(如果37原来有左子树,就交给24变成其右子树,不过现在没有)最终结果:...

最优二叉树
wn构成n棵二叉树的森林F={T T … T n} 其中每棵二叉树T i中都只有一个权值为w i的根结点 其左右子树均空 ( )在森林F中选出两棵根结点权值最小的树(当这样的树不止两棵树时 可以从中任选两棵) 将这两棵树合并成一棵新树 为了保证新树仍是二叉树 需要增加一个新结点作为新树的根 ...

为什么树转换成的二叉树根的右子树一定为空?
因为树的根没有兄弟,只有儿子。在树转换到二叉树的操作中,我们定义二叉树的一个结点的右儿子为该结点在未转换前的树中的兄弟结点。树的根结点在转换为二叉树后为其根结点,而树的根结点没有兄弟结点,所以二叉树根的右子树为空。当然,要是将森林装换为二叉树就得另说了!

哈夫曼树的构建过程
哈夫曼树:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。哈夫曼树的构造:假设给定的权值如下:3,5,7,8,10,15;首先取集合中最小的两个数:3...

哈夫曼编码
根据最优二叉树构造哈夫曼编码 利用哈夫曼树很容易求出给定字符集及其概率(或频度)分布的最优前缀码 哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术 该技术一般可将数据文件压缩掉 %至 % 其压缩效率取决于被压缩文件的特征 . 具体做法  ( )用字符ci作为叶子 pi或fi做为叶子ci的权 构造...

长岛县19871961891: 如何将一般二叉树变为二叉排序树 c语言 -
撒耐复方: #include /* 定义结构体 */ typedef int TypeData; typedef struct stBiTreeNode { TypeData data; struct stBiTreeNode *lchild, *rchild; }BITREENODE;/* * 函数功能:判断要插入的数据是否存在 * 函数参数:root 根节点 data 要查询的数据 lastNode 如果...

长岛县19871961891: C++实现将一个已知的二叉树转化为二叉排序树 -
撒耐复方: //建立二叉排序树void InsertBST(STreeNode *t,int key){ if(t==NULL) { t=new STreeNode; t->left_child=t->right_child=NULL; ...

长岛县19871961891: 把已经建立的二叉树转换成二叉排序树的算法实现(C++) -
撒耐复方: typed RcdType TElemType; void Insert_BST( BiTree &T, KeyType e ) { // 在以T为根指针的二叉排序树中插入记录e s=new BiTNode; // 生成新的结点 s->data=e; s->lchild=NULL; s->rchild=NULL; //新插入结点必为叶 if(!T) T=s; // 插入的结点为...

长岛县19871961891: C++实现将一个已知的二叉树转化为二叉排序树 -
撒耐复方: 通过以下代码获取文件大小,然后分配相应大小的内存,一次性读取文件到此内存就可以加快读取速度了.具体代码如下: #include#includeint main () { FILE * pFile; long lSize; char * buffer; size_t result; /* 若要一个byte不漏地读入整个文件,...

长岛县19871961891: 用C语言实现二叉排序树的构造 -
撒耐复方: #include <stdio.h>#include <stdlib.h> typedef struct bnode { int data; struct bnode *left , *right ; } btree ; void insert(btree **b , btree *s) { if(*b==NULL) *b = s ; else if((*b)->data == s->data) return ; else if(s->data > (*b)->data) insert(&(*b)->right , s); else...

长岛县19871961891: 试编写一个算法 将升序的二叉排序树变为降序的二叉排序树 -
撒耐复方: 将一棵根为root的升序二叉排序树转为降序二叉排序树,算法思路是:(1) 如果树root为空,算法结束;(2) 将root的左子树转为降序二叉排序树,将root的右子树转为降序二叉排序树;(3) 将root的左右孩子进行交换,即左孩子变为右孩子...

长岛县19871961891: 二叉排序树的实现(c语言)
撒耐复方: /*二叉树的基本运算与实现*/#include <stdio.h>#include <malloc.h>#define MAXNODE 256typedef int datatype;typedef struct BiTNode{ datatype data; struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;typedef struct{ BiTree link; int flag;}stacktype; void ...

长岛县19871961891: 实现二叉排序树建立和检索算法(C语言)【急求】 -
撒耐复方: #include <stdlib.h>#include <time.h>#include <stdio.h>#define INFMT "%d"#define OUTFMT "%d "/* #define NULL 0L */#define BOOL int#define TRUE 1#define FALSE 0#define LEN 10000 typedef int ElemType; typedef struct BSTNode { ...

长岛县19871961891: 用C语言实现二叉排序树的查找、插入和删除 -
撒耐复方: #include <stdio.h>#include <conio.h> #include <stdlib.h> typedef struct BitNode { char data; struct BitNode *lchild,*rchild; }BitNode,*BiTree; void CreateBiTree(BiTree &); //生成一个二叉树 void FirstOrder(BiTree); //先序递归遍历二叉树 void ...

长岛县19871961891: 实现二叉排序树的生成,完成二叉排序树的遍历、查找. 要求: -
撒耐复方: 利用c语言,代码如下仅供参考: 说明:为了保证输入的数据按要求构造出想要的、唯一确定的二叉树的形状,这里输入要求利用广义表的形式,虽然会显得繁琐一点,但足以保证严谨性.否则只是单纯一串数字,树形就能千变万化,不一定的...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网