C++ 实现将中序遍历的结果存储于数组并输出

易错点一

  • 关于数组动态输入
	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);
	}
}
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值