1. 怎样从键盘输入二叉树各结点建树,并进行层次和先序,输出结果.
从键盘输入二叉树各结点建树(空输入*):
BTNode * CreatBT()
{ BTNode *t;
char c;
scanf("%c",&c);
if(c=='*') return NULL;
{ t=(BTNode )malloc(sizeof(BTNode));
t->data=c;
t->lchild=CreatBT();
t->rchild=CreatBT();
return t;
}
/*先序递归遍历*/
void DLR(BTNode *bt)
{ if(bt)
{ printf("%c",bt->data);
DLR(bt->lchild);
DLR(bt->rchild);
}
}
/*层次遍历二叉树bt*/
void LevelOrder(BTNode *bt)
{ BTNode* queue[MAXSIZE];
int front,rear;
if (bt==NULL) return;
front=0; /*非循环队列*/
rear=0;
queue[rear++]=bt;
while(front!=rear)
{printf("%c",queue[front]->data); /*访问队首结点的数据域*/
if(queue[front]->lchild!=NULL) /*将队首结点的左孩子入队*/
{ queue[rear]=queue[front]->lchild;rear++;}
if(queue[front]->rchild!=NULL) /*将队首结点的右孩子入队列*/
{ queue[rear]=queue[front]->rchild; rear++; }
front++;
} /* while */
}/* LevelOrder*/
2. 建立一棵二叉树,数据以字符串形式从键盘输入。
代码如下:
char a[105];
int len,i;//i逐渐增加
void build(int s){
if(i==len) return;//已经建完树了
char c=a[i];//当前的字符
i++;
if(!tree[s].l) tree[s].l=c;//如果树的左边是空的,就给左边赋值
else tree[s].r=c;//反之
if(c!=' ') build(c);
if(c!=' ') build(c);//再来递归两下
}
(2)二叉树怎么输入数据扩展阅读
树的定义还需要强调以下两点:
1)n>0时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有一个根结点。
2)m>0时,子树的个数没有限制,但它们一定是互不相交的。
由树的定义可以看出,树的定义使用了递归的方式。递归在树的学习过程中起着重要作用。
结点拥有的子树数目称为结点的度。结点子树的根结点为该结点的孩子结点。相应该结点称为孩子结点的双亲结点。从根开始定义起,根为第一层,根的孩子为第二层,以此类推。树中结点的最大层次数称为树的深度或高度。由二叉树定义以及图示分析得出二叉树有以下特点:
1)每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点
2)左子树和右子树是有顺序的,次序不能任意颠倒。
3)即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。
3. 数据结构(C语言版) 建立二叉树数据怎么输入
typedef struct BiTNode{ ............} BiTNode,*BiTree;BiTree CreateBiTree(){ BiTree T;char ch;scanf("%c",&ch);if(ch==' ')return (NULL); else{ if(!(T=( BiTNode*)malloc(sizeof(BiTNode))))return 0; T->data=ch; //生成根结点 T->lchild= CreateBiTree(); //构造左子树 T->rchild=CreateBiTree(); //构造右子树。因为前面定义具有BiTNode相同类型的二叉树,所以把递归的值付给右孩子 return (T); }}
4. 创建二叉树是怎么输入
void CreateTree(BTree *T)
{
char c;
c=getchar();
getchar();//<------------------here
if (c=='#')
(*T)=NULL;
else
{
(*T)=(BTree)malloc(LEN_T);
CreateTree(&(*T)->lchild);
(*T)->data=c;
CreateTree(&(*T)->rchild);
}
}
输入为(只是一个例子)
先序输入二叉树:
a
b
#
C
#
#
#
先序遍历:
a b C
先序遍历(非递归):
a b C
中序遍历:
b C a
中序遍历(非递归):
b C a
后序遍历:
C b a
后序遍历(非递归):
C b a
层次遍历(链式):
a b C
层次遍历(顺序):
a b CPress any key to continue
5. 二叉树创建问题,怎么实现输入多组数据
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTreeNode{
int data;
struct BiTreeNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
void print2 ( BiTree T )
{
if ( T )
{
print2 ( T->lchild ) ;
printf ( "%c" , T->data ) ;
print2 ( T->rchild ) ;
}
// printf ( "\n" ) ;
}
void print3 ( BiTree T )
{
if ( T )
{
print3 ( T->lchild ) ;
print3 ( T->rchild ) ;
printf ( "%c" , T->data ) ;
}
// printf ( "\n" ) ;
}
int countleaf(BiTree T)
{
if(T == NULL)
return 0;
else
if(T->lchild == NULL && T->rchild == NULL)
return 1;
return(countleaf(T->lchild) + countleaf(T->rchild));
}
int btdepth(BiTree T)
{
int leftdep, rightdep;
if(T == NULL)
return 0;
else
{
leftdep = btdepth(T->lchild);
rightdep = btdepth(T->rchild);
if(leftdep > rightdep)
return leftdep + 1;
else
return rightdep + 1;
}
}
int main()
{
BiTree CreateBiTree();
void previsit(BiTree T);
while (1)
{
BiTree BT=CreateBiTree();
puts("OK@!");
previsit(BT);//先序遍历
printf ( "\n" ) ;
print2 ( BT ) ;//中序遍历
printf ( "\n" ) ;
print3 ( BT ) ;//后序遍历
putchar('\n');
printf ( "%d\n" , countleaf(BT)) ;
printf ( "%d\n" , btdepth(BT)) ;
}
return 0;
}
//BiTNode *lchilde ,*rchilde;
BiTree CreateBiTree(){
//按先后顺序输入儿茶书中的节点值,*字符表示空 输入时按层次遍历输入
//构造二叉链表示的二叉树
char ch;
BiTree T;
scanf("%c",&ch);
if(ch=='$')
T=NULL;
else
{
T=(BiTNode*)malloc(sizeof(BiTNode));
if(!T)
return(0);
T->data=ch; //生成根节点
T->lchild=CreateBiTree(); //构造左子树
T->rchild=CreateBiTree(); //构造右子树
}
return T;
} //CreatBiTree
void previsit(BiTree T)
{
//采用二叉树链表存储结构,visit 是对数据结构表元素操作的应用函数。
if(T)
{
printf("%c",T->data);
previsit(T->lchild);
previsit(T->rchild);
}
// printf ( "\n" ) ;
}
6. 怎么输入一个二叉树,树中每个节点存放了一个整数值
先定义二叉树的存储结构,不同的定义方法相应有不同的存储结构的建立算法。
如二叉树采用二叉链表存储结构,如下:
#define OK 1
#define OVERFLOW -1
typedef int TElemType;
typedef int Status;
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild ;//左孩子指针
struct BiTNode *rchild; // 右孩子指针
} BiTNode;//二叉树结点
typedef BiTNode *BiTree; //二叉树
int ch;
按给定的带 0 标记的先序序列定义一棵二叉树,如下:
Status CreateBiTree(BiTree &T)
{//按先序序列建儿叉树
scanf("%d",&ch);
if (ch= =0 ) T = NULL;
else {
if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data = ch; // 生成根结点
CreateBiTree(T->lchild); // 构造左子树
CreateBiTree(T->rchild); // 构造右子树
}
return OK;
} // CreateBiTree
例如,输入先序序列如下:1 2 0 3 0 0 4 0 0
建立的二叉树如下:
1
/ \
2 4
\
3
7. 数据结构C语言版 二叉树构造算法实验 在键盘上怎么输入
同学你好:我帮你看了你的程序:这是修改了的程序:希望你能采纳:
这是实验结果:是正确的
#include"stdio.h"
#include"stdlib.h"
#defineOK1
#defineERROR0
#defineOVERFLOW-2typedefcharTElemType;
typedefintStatus;
typedefstructBiTNode{//结点结构
TElemType data;
structBiTNode *lchild,*rchild;
//左右孩子指针
}BiTNode,*BiTree;//以下是建立二叉树存储结构
StatusCreateBiTree(BiTree&T){
//请将该算法补充完整,参见第6章课件算法或课本
charch;
scanf("%c",&ch);
if(ch=='#')T=NULL;
else{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
returnOK;}//CreateBiTree
voidPreorder(BiTreeT)
{
if(NULL==T)
{
return;
}
else
{
printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}voidInorder(BiTreeT)
{//中序遍历二叉树
//请将该算法补充完整,参见第6章课件算法
if(T)
{
Inorder(T->lchild);
printf("%c",T->data);
Inorder(T->rchild);
}
}
voidPostorder(BiTreeT)
{//后序遍历二叉树
//请将该算法补充完整,参见第6章课件算法
if(T)
{
Postorder(T->lchild);
Postorder(T->rchild);
printf("%c",T->data);
}
}//以下是求叶子结点数
voidCountLeaf(BiTreeT,int&count){
//请将该算法补充完整,参见第6章课件算法
if(T){
if((!T->lchild)&&(!T->rchild))
count++;
CountLeaf(T->lchild,count);
CountLeaf(T->rchild,count);
}
}//以下是求二叉树的深度
intDepth(BiTreeT){
//请将该算法补充完整,参见第6章课件算法
intdepthval,depthLeft,depthRight;
if(!T) depthval=0;
else{
depthLeft=Depth(T->lchild);
depthRight=Depth(T->rchild);
if(depthLeft>depthRight)depthval=1+depthLeft;
elsedepthval=1+depthRight;
}
returndepthval;
}voidmain(){
BiTreeT;
ints=0,d;
printf(" creatofthebitree: ");
CreateBiTree(T);
printf(" outputresultofPreorder: ");
Preorder(T);
printf(" ");printf("
outputresultofInorder:
");
Inorder(T);
printf(" ");printf("
outputresultofPostorder:
");
Postorder(T);
printf(" ");CountLeaf(T,s);
d=Depth(T);
printf(" leaves=%d ",s);
printf(" depth=%d ",d);
}
8. 数据结构的二叉树中,怎么输入字符序列,建立二叉链表
#include <stdio.h>
#include <stdlib.h>
#define OVERFLOW -1
#define OK 1
#define ERROR 0
typedef int Status;
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild;//左孩子指针
struct BiTNode *rchild;// 右孩子指针
}BiTNode;
typedef BiTNode *BiTree;
Status CreateBiTree(BiTree &T)
{//按给定的带空指针标记的先序序列建二叉链表
char ch;
ch=getchar();
if (ch==' ') T = NULL;
else {
if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data = ch; // 生成根结点
CreateBiTree(T->lchild); // 构造左子树
CreateBiTree(T->rchild); // 构造右子树
}
return OK;
} // CreateBiTree
void Display(TElemType& e)
{
printf("%c\t",e);
}
void InOrderTraverse (BiTree T, void( *visit)(TElemType& e))
{ // 先序遍历二叉树
if (T==NULL) return;
InOrderTraverse(T->lchild, visit); // 遍历左子树
visit(T->data); // 访问根结点
InOrderTraverse(T->rchild, visit); // 遍历右子树
}
void main()
{
BiTree R;
printf("输入带空指针标记的先序序列:(例如AB C D )\n");
CreateBiTree(R);
printf("该二叉树的中序序列为:\n");
InOrderTraverse(R,Display);
printf("\n");
}
9. 二叉树输入
因为在这个程序的实现逻辑里#输入表示当前结点为空,叶子结点的意思是其左右子树都为空的结点,所以你需要针对叶子结点的左右子树输入#表示其左右子树的根结点都为空。
10. 关于二叉树的输入
void CreateBiTree(BiTree **T)//树的初始化
{
char ch;
ch=getchar();
if(ch=='# ') *T=NULL;
else
{
if(!(*T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(error);
(*T) ->data=ch;
CreateBiTree((*T)->lchild);
CreateBiTree((*T)->rchild);
}
} //按一个先序二叉树输入,空树输入#