易错点一
- 关于数组动态输入
int str[10] ;
for(int i = 0 ; i< 10 ;i++){
scanf("%d",str[i]) ;
}
错误原因在于,没有加入引用,正确写法如下
int str[10] ;
for(int i = 0 ; i< 10 ;i++){
scanf("%d",&str[i]) ;
}
将中序遍历结果输出在数组中完整代码
- 创建二叉树
- 遍历输出
#include <stdio.h>
#include <stdlib.h>
typedef int KeyType;
typedef struct BSTNode{
KeyType key;
struct BSTNode *lchild,*rchild;
}BSTNode,*BiTree;
int BST_Insert(BiTree &T,KeyType k)
{
if(NULL==T)
{ //为新节点申请空间
T=(BiTree)malloc(sizeof(BSTNode));
T->key=k;
T->lchild=T->rchild=NULL;
return 1;//代表插入成功
}
else if(k==T->key)
return 0;//发现相同元素,就不插入
else if(k<T->key)
return BST_Insert(T->lchild,k);
else
return BST_Insert(T->rchild,k);
}
//创建二叉排序树
void Creat_BST(BiTree &T,KeyType str[],int n)
{
T=NULL;
int i=0;
while(i<n)
{
BST_Insert(T,str[i]);
i++;
}
}
int array[10] ={0} ;
void InOrder(BiTree T)
{
if(T!=NULL)
{
InOrder(T->lchild);
printf("%3d",T->key);
InOrder(T->rchild);
}
}
int InOrderStr(BiTree T,int pos ,int array[])
{
if(T==NULL) return pos ;
pos = InOrderStr(T->lchild,pos,array);
array[pos] =T->key ;
return InOrderStr(T->rchild,pos+1,array);
}
//void InOrder2(BiTree T)
//{
// if(T!=NULL)
// {
// InOrder(T->lchild);
// int * i = 0 ;
// array[(*i)++] = T->key ;
// InOrder(T->rchild);
// }
//}
int main()
{
BiTree T;
BiTree parent;//存储父亲结点的地址值
BiTree search;
//KeyType str[10] ={87,7,60,80,59,34,86,99,21,3} ;//将要进入二叉排序树的元素值
KeyType str[10] ;
for(int i = 0 ; i< 10 ;i++){
scanf("%d",&str[i]) ;
}
Creat_BST(T,str,10);
InOrderStr(T,0,array) ;
for(int i =0 ;i<10;i++){
printf("%d ",array[i]) ;
}
system("pause");
}
注意理解注释下为什么执行错误(附截图如下)
- 建议:不要用 ++。先想好 pos 的准确意义是什么,以及函数究竟应该返回什么,什么不返回数组?因为数组是在函数外面开的,而整个过程都只是在往数组里添加东西而已。这个函数的调用者肯定持有这个数组的引用,所以我就不用返回数组
方式二
//pos代表存入到第几个位置
void InOrder(BiTree T, KeyType str[],int &pos)
{
if (T != NULL)
{
InOrder(T->lchild,str,pos);
printf("%3d", T->key);
str[pos++] = T->key;//输出的同时存入到数组
InOrder(T->rchild,str,pos);
}
}