建立二叉树需要注意

先附上错误代码

//二叉树的前序遍历算法,采用递归调用的方式
void preordertraverse(BiTNode* a)
{
	if(a == NULL)
	{
		return;
	}
	cout << "data : " << a->data << endl;
	preordertraverse(a->lchild);
	preordertraverse(a->rchild);
}

void createBiTree(BiTNode* a)  //用一级指针有问题,因为不能访问!
{
	Telemtype data;
	cout << "data = " << endl;
	cin >> data;
	if(data == "#")
		a = NULL;
	else
	{
		a = (BiTNode*)malloc(sizeof(BiTNode));
		if(!a)
			exit(OVERFLOW);
		a->data = data;
		createBiTree(a->lchild);
		createBiTree(a->rchild);
	}
}

int main()
{
	BiTNode* a;
	createBiTree(a);
	preordertraverse(a);
	return 0;
}

这段代码问题出错在,只能创建二叉树,但是不能遍历访问二叉树,因为preordertraverse(a)中的a并没有存储二叉树的首地址,a = =NULL。
修改:要将二叉树的形参设置为二级指针。

void createBiTree(BiTNode** a)  //注意这里要用二级指针,一级指针作为作为形参,不能返回帧栈中创建的变量的地址!!!
{
	Telemtype data;
	cout << "data = " << endl;
	cin >> data;
	if(data == '#')
		*a = NULL;
	else
	{
		*a = (BiTNode*)malloc(sizeof(BiTNode));
		if(!*a)
			exit(EOVERFLOW);
		(*a)->data = data;
		createBiTree(&(*a)->lchild);
		createBiTree(&(*a)->rchild);
	}
}

int main()
{
	BiTNode* b;
	createBiTree(&b);
	preordertraverse(b);
	return 0;
}

补充:
遍历线索二叉树的时候(以中序举例),需要注意代码思路,和先迭代左子树,再访问根结点,最后迭代右子树是一样的!

/*以下为遍历函数*/
//思路就是先向左子树遍历,采用的依据就是判断ltag是否是0,之后通过p->rtag==1找到根结点,再p=p->rchild找到右子树。
int inordertraverse_thr(BithrNode* t) 	//t指向头节点
{
	BithrNode* p;
	p = t->lchild; 			/*p指向根结点*/
	while(p != t)
	{
		while(p->ltag == link)			//找到并输出该树中最左的孩子
			p = p->lchild;
		cout << p->data << endl; /
		while(p->rtag == thread && p->rchild != t)	//输出该树的根结点
		{
			p = p->rchild;
			cout << p->data <<endl;
		}
		p = p->rchild;		/*跑向右孩子*/
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值