主题:一个简单的问题c++ 成功必给分
//中序遍历二叉树输出第k个元素,先序遍历二叉树输出最后一个元素
#include "iostream.h"
#include "stdlib.h"
#include "conio.h"
#define MaxSize 100
int h=2;//定义为全局变量 ,即要输出的元素
typedef char ElemType;
typedef struct Node{
ElemType data;
struct Node *left,*right;
}BTree; //树的单元结构
void creatree(BTree **BT,ElemType *str){
//根据括弧表示法创建一棵二叉树
BTree *stack[MaxSize],*p;
int top=-1,k,j=0; //top为栈指针,k指定是左还是右孩子,j为str指针
char ch;
*BT=NULL;
ch=str[j];
while(ch!='\0'){
switch(ch){
case '(':top++;stack[top]=p;k=1; break; //标示为左孩子
case ')':top--; break;
case ',':k=2;//标示为右孩子
break;
default:p=(BTree *)malloc(sizeof(BTree));
p->data=ch;
p->left=p->right=NULL;
if(*BT==NULL) //根结点
*BT=p;
else{
switch(k){
case 1:stack[top]->left=(BTree *)malloc(sizeof(BTree));
stack[top]->left=p;break;
case 2:stack[top]->right=(BTree *)malloc(sizeof(BTree));
stack[top]->right=p;
}
}
}
j++;
ch=str[j];
}
}
void preorder(BTree *BT){ //先序遍历输出最后一个元素
if(BT!=NULL){
if(BT->right==NULL){ //先序输出最后一个肯定是最右下的,如果右没有的话就输出本身
cout<<BT->data;
return ;
}
preorder(BT->right);
}
}
void inorder(BTree *BT){ //中序遍历输出第k个元素
int n=0;
if(BT!=NULL){
inorder(BT->left);
{n++;if(n==h){cout<<BT->data;return;}}
inorder(BT->right);
}
}
main(){
char yumensi[100],tianla;
int i=0;
cout<<"请用括号表示法输入一棵二叉树并以一个.结束,例如"<<"'A(B(D,E(H,I)),C(G)).'"<<endl;
cout<<"请注意正确输入因为程序不能判断输入是否正确!!否则后果自负!!"<<endl;
cin>>tianla;
while(tianla!='.'){
yumensi[i]=tianla;
i++;
cin>>tianla;
}
yumensi[i]='\0';
BTree *tree;
creatree(&tree,yumensi);
cout<<"先序遍历最后一个元素:";
preorder(tree); cout<<endl;
cout<<"中序遍历第k个元素:";
inorder(tree); cout<<endl;
getch();
}
中序遍历给出第k个元素的时候老是出毛病,程序中k其实是为h,开头的那个全局变量.
解决问题必给分!!
#include "iostream.h"
#include "stdlib.h"
#include "conio.h"
#define MaxSize 100
int h=2;//定义为全局变量 ,即要输出的元素
typedef char ElemType;
typedef struct Node{
ElemType data;
struct Node *left,*right;
}BTree; //树的单元结构
void creatree(BTree **BT,ElemType *str){
//根据括弧表示法创建一棵二叉树
BTree *stack[MaxSize],*p;
int top=-1,k,j=0; //top为栈指针,k指定是左还是右孩子,j为str指针
char ch;
*BT=NULL;
ch=str[j];
while(ch!='\0'){
switch(ch){
case '(':top++;stack[top]=p;k=1; break; //标示为左孩子
case ')':top--; break;
case ',':k=2;//标示为右孩子
break;
default:p=(BTree *)malloc(sizeof(BTree));
p->data=ch;
p->left=p->right=NULL;
if(*BT==NULL) //根结点
*BT=p;
else{
switch(k){
case 1:stack[top]->left=(BTree *)malloc(sizeof(BTree));
stack[top]->left=p;break;
case 2:stack[top]->right=(BTree *)malloc(sizeof(BTree));
stack[top]->right=p;
}
}
}
j++;
ch=str[j];
}
}
void preorder(BTree *BT){ //先序遍历输出最后一个元素
if(BT!=NULL){
if(BT->right==NULL){ //先序输出最后一个肯定是最右下的,如果右没有的话就输出本身
cout<<BT->data;
return ;
}
preorder(BT->right);
}
}
void inorder(BTree *BT){ //中序遍历输出第k个元素
int n=0;
if(BT!=NULL){
inorder(BT->left);
{n++;if(n==h){cout<<BT->data;return;}}
inorder(BT->right);
}
}
main(){
char yumensi[100],tianla;
int i=0;
cout<<"请用括号表示法输入一棵二叉树并以一个.结束,例如"<<"'A(B(D,E(H,I)),C(G)).'"<<endl;
cout<<"请注意正确输入因为程序不能判断输入是否正确!!否则后果自负!!"<<endl;
cin>>tianla;
while(tianla!='.'){
yumensi[i]=tianla;
i++;
cin>>tianla;
}
yumensi[i]='\0';
BTree *tree;
creatree(&tree,yumensi);
cout<<"先序遍历最后一个元素:";
preorder(tree); cout<<endl;
cout<<"中序遍历第k个元素:";
inorder(tree); cout<<endl;
getch();
}
中序遍历给出第k个元素的时候老是出毛病,程序中k其实是为h,开头的那个全局变量.
解决问题必给分!!