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);
}
} //按一個先序二叉樹輸入,空樹輸入#