编写算法:已知二叉排序树按二叉链表形式存储,树中结点各不相同,欲得到一个由小到大的结点值递增序列
来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/15 23:05:52
编写算法:已知二叉排序树按二叉链表形式存储,树中结点各不相同,欲得到一个由小到大的结点值递增序列
已知二叉排序树按二叉链表形式存储,树中结点各不相同,欲得到一个由小到大的结点值递增序列,编写算法达到要求结果.
已知二叉排序树按二叉链表形式存储,树中结点各不相同,欲得到一个由小到大的结点值递增序列,编写算法达到要求结果.
首先看下二叉排序树的定义:
二叉排序树(Binary Sort Tree)又称二叉查找树,亦称二叉搜索树.它或者是一棵空树;或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树;
由定义可知,采用中序遍历的输出序列,就是“一个由小到大的结点值递增序列”
代码参考如下:
#include <stdio.h>
#include <malloc.h>
typedef int KeyType;
typedef struct node //记录类型
{
KeyType key; //关键字项
struct node *lchild,*rchild; //左右孩子指针
} BSTNode;
int InsertBST(BSTNode *&p,KeyType k)
{
if (p==NULL) //原树为空, 新插入的记录为根结点
{
p=(BSTNode *)malloc(sizeof(BSTNode));
p->key=k;
p->lchild=p->rchild=NULL;
return 1;
}
else if (k==p->key) //树中存在相同关键字的结点,返回0
return 0;
else if (k<p->key)
return InsertBST(p->lchild,k); //插入到*p的左子树中
else
return InsertBST(p->rchild,k); //插入到*p的右子树中
}
BSTNode *CreateBST(KeyType A[],int n) //返回BST树根结点指针
{
BSTNode *bt=NULL; //初始时bt为空树
int i=0;
while (i<n)
{
InsertBST(bt,A[i]); //将关键字A[i]插入二叉排序树T中
i++;
}
return bt; //返回建立的二叉排序树的根指针
}
void mid_order(BSTNode *T)//中序遍历二叉树
{
if(T)
{
mid_order(T->lchild);
printf(" %d ",T->key);
mid_order(T->rchild);
}
}
void main()
{
BSTNode *bt,*p,*f;
int n=9;
KeyType a[]={1,12,5,8,3,10,7,13,9};
bt=CreateBST(a,n);
printf("BST:");mid_order(bt);printf("\n");
}
再问: 首先,谢谢你的帮助。我还有一个疑问,因为这是一道数据结构题,我是不只用写出算法即可,还是需要完整的程序啊
再答: 以上已经包含完整的程序可编译可运行
再问: 恩恩,好的,谢谢啊。
再答: 如有帮助,请采纳
再问: 必须采纳你的。。稍后给你分哈。
二叉排序树(Binary Sort Tree)又称二叉查找树,亦称二叉搜索树.它或者是一棵空树;或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树;
由定义可知,采用中序遍历的输出序列,就是“一个由小到大的结点值递增序列”
代码参考如下:
#include <stdio.h>
#include <malloc.h>
typedef int KeyType;
typedef struct node //记录类型
{
KeyType key; //关键字项
struct node *lchild,*rchild; //左右孩子指针
} BSTNode;
int InsertBST(BSTNode *&p,KeyType k)
{
if (p==NULL) //原树为空, 新插入的记录为根结点
{
p=(BSTNode *)malloc(sizeof(BSTNode));
p->key=k;
p->lchild=p->rchild=NULL;
return 1;
}
else if (k==p->key) //树中存在相同关键字的结点,返回0
return 0;
else if (k<p->key)
return InsertBST(p->lchild,k); //插入到*p的左子树中
else
return InsertBST(p->rchild,k); //插入到*p的右子树中
}
BSTNode *CreateBST(KeyType A[],int n) //返回BST树根结点指针
{
BSTNode *bt=NULL; //初始时bt为空树
int i=0;
while (i<n)
{
InsertBST(bt,A[i]); //将关键字A[i]插入二叉排序树T中
i++;
}
return bt; //返回建立的二叉排序树的根指针
}
void mid_order(BSTNode *T)//中序遍历二叉树
{
if(T)
{
mid_order(T->lchild);
printf(" %d ",T->key);
mid_order(T->rchild);
}
}
void main()
{
BSTNode *bt,*p,*f;
int n=9;
KeyType a[]={1,12,5,8,3,10,7,13,9};
bt=CreateBST(a,n);
printf("BST:");mid_order(bt);printf("\n");
}
再问: 首先,谢谢你的帮助。我还有一个疑问,因为这是一道数据结构题,我是不只用写出算法即可,还是需要完整的程序啊
再答: 以上已经包含完整的程序可编译可运行
再问: 恩恩,好的,谢谢啊。
再答: 如有帮助,请采纳
再问: 必须采纳你的。。稍后给你分哈。
编写算法:已知二叉排序树按二叉链表形式存储,树中结点各不相同,欲得到一个由小到大的结点值递增序列
二叉树的结点算法设计一个算法,根据一个二叉树结点的先根序列和中根序列构造出该二叉树.假设二叉树是链接表示的,并且任意两个
已知一棵树的由根至叶子结点按层次输入的结点序列及每个结点的度试写出构造此树的孩子-兄弟链表的算法.
试编写计算二叉树深度、所有结点总数、叶子结点数、双孩子结点个数、单孩子结点个数的算法
关于二叉树结点算法的问题
求二叉树的结点个数算法
1.具有12个结点的二叉树的二叉链表存储结构中,空链域NULL的个数为( ) A.11 B.13 C.23 D.25
已知带表头结点的单链表L,指针P指向L链表中的一个结点(非首、尾结点):删除P结点的语句序列是?
1.设某棵二叉树中度数为0的结点数为N0,度数为1的结点数为N1,若采用二叉链表作为该二叉树的存储结构,则该二叉树中共有
给出在先序线索二叉树中查找结点p的后继结点的过程 简答 不要算法
一个完全二叉树中,如果叶子结点的个数为n.则这颗二叉树一共有几个结点
二叉树的结点指针值是什么?