C++数据结构中二叉树遍历问题有一点代码看不懂求帮助

voidPostOrder(void(*visit)(BinTreeNode<T>*t)){PostOrder(root,visit);}函数体中PostOrder(ro... void PostOrder(void (*visit)(BinTreeNode<T> *t)) { PostOrder(root, visit); }函数体中 PostOrder(root, visit)是什么意思?为什么这里可以出现两个参数?还有就是函数中又调用了自己 展开
 我来答
CodeBlove
2020-05-18 · TA获得超过3364个赞
知道小有建树答主
回答量:936
采纳率:79%
帮助的人:249万
展开全部
void PostOrder(void (*visit)(BinTreeNode<T> *t))
{
PostOrder(root, visit);
}

虽然只是片段没有上下文,但是拆开来看就懂了。
首先,PostOrder()这个函数不返回数据,其次你把PostOrder的一对括号剥离掉去看,那么括号内只含一个参数:void (*visit)(BinTreeNode<T> *t),它又是一个函数定义,函数名为visit,括号包裹着一个星,代表这是个函数指针,该函数也没有返回值,OK,那么我们分析起来就不用管它们返回什么东西了,注意力集中在visit的定义和参数上。

visit此时作为PostOrder()的形参,因此函数指针visit只在PostOrder内有意义,函数本尊名称叫什么对于PostOrder来说不重要,PostOrder在调用此函数指针能满足其接口即可,该函数的声明为:void(*)(BinTreeNode<T>*),即其也只含一个参数:BinTreeNode<T>类型的指针,而t是形参名。

继续剥离开来看,由于我没看到定义,从类型上看BinTreeNode是一个自定义泛型类,T是可以是个任意基础类型,调用时代入即可.

PostOrder内调用PostOrder(root, visit),类或者当前命名空间中肯定还有个带两个参数的重载函数,由于你没给出代码,我只能猜测其声明如下:
//根节点传递指针
void PostOrder(BinTreeNode<T> * proot , void (*visit)(BinTreeNode<T> * t))
或者是
//根节点直接传递实体
void PostOrder(BinTreeNode<T> root ,void (*visit)(BinTreeNode<T> * t))
实际是传递根节点指针还是结构体要看设计要求,一般传递指针比较方便。root就是根节点,visit就是那个函数指针了,也就是说PostOrder的作用是传递根节点和访问函数的指针给他的兄弟去完成任务。

所以不是调用自己,注意参数个数。
追问
谢谢大佬,感激不尽,大佬牛逼
最大的宝宝
2020-05-18 · TA获得超过828个赞
知道小有建树答主
回答量:1569
采纳率:67%
帮助的人:414万
展开全部
这里两个PostOrder是不同的,在c++中称为重载。前一个只有一个函数指针作为参数,后一个是带两个参数的。显然后面这一个应该有定义,估计你没有细看,漏掉了这部分代码。但不管怎么样,它肯定是使用到递归的,就是自己调用自己。

后序遍历这块的实现其实很简单,先左后右,最后根
追问
谢谢大哥,确实是没注意到,因为书上的代码写的有点分散
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
甜甜的小汪
2020-05-17 · 超过103用户采纳过TA的回答
知道小有建树答主
回答量:331
采纳率:84%
帮助的人:53.6万
展开全部
很高兴为您解答!
出现了两个参数,这两个参数要是同一类型就行。
函数中自己调用自己叫递归。
更多追问追答
追问
您好关于两个参数我还是不太明白这是C++中哪一块的知识
追答
我们用的书上好像没有,但是老师这么用过,我一般不这么用
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式