二叉树——输出叶子到根节点的路径

目录

代码

算法思想

例子

思维拓展


代码

int LeaveBit(Bitree T,int flag,int g) {
	if (!T) {
		return 0;
	}
	if (T->rchild == NULL && T->lchild == NULL) {
		//cout << "empty:" << T->data << endl;
		s.push(T->data);
		while (!s.empty()) {
			cout << s.top();
			s.pop();
		}
		//cout << flag;
		cout << endl;
		if (flag ==-1) {
			p.pop();
		}
		s = p;
		return 1;
	}
	else {
		if (g == 0) {
				p.push(T->data);
		}
		s.push(T->data);
		//cout << "push:" << T->data << endl;
		return LeaveBit(T->lchild,1,0) + LeaveBit(T->rchild,-1,0);
	}
}

算法思想

1)这里说明一下s和q是栈,s这个栈主要是存储根到叶子的路径,而p这个栈则存储的是左孩子或右孩子不为空的结点

2)flag是表示是否要删除p栈中的栈顶的值

由代码可知,向左后右。所以右边部分开始递归时,也就代表着一个结点(左孩子、右孩子不为空)已经完成了,可以开始p栈中下一个结点。

3)g表示p栈是否可以存储了除了根节点以外的结点

/*语言表达不好,请见谅*/

例子

思维拓展

开始我的思路:想将栈拿到递归里面去,但为什么要放弃呢?因为我发现栈的遍历输出相对麻烦。后面我想了两个解决办法,一个是指针,还有就是迭代器,因为我用的是stl这个库,如何弄指针不清楚(书到用时方恨少!!!!),而迭代器这个就有点好笑了,后面问了ai才知道stack并不提供迭代器。

当然不一定要用栈,可以用数组的方式,然后将数组代入递归,flag这个就不需要了,你们也可以试着写一下,大概的思路和我这个差不多(提前是要理解)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值