你的这个左右节点都多余了一个_root属性
BinaryTree* _ltree;
BinaryTree* _rtree;
这个左右子树里面的_root分别代表左右子树的根节点,没有问题啊
你要觉得没问题,你可以找出一千种理由来支持你的说法,而且我也没法证明你是错的,因为这里不存在对与错。
因为只有将其放置到特定的场景中时,场景的上下文才会对你的设计提出需要修改的地方。
在自身的类中 声明自身的变量,容易让初学者理解,因为这样子可以代表 所有的节点都一样,所有的节点即可以成为父节点,也可以成为子节点,而且 在演示递归算法的时候 更容易让人理解。像你那种写法,初学者容易搞懂。一般来说,初学者,喜欢让自己的想法 传播给所有的人的人 喜欢子这样子写。
但是写书的人都喜欢装B,喜欢 搞“为了对象而对象”的思维。所以 就那样子写啦。
我上学的时候的数据结构的定义就是类似于这种的方式:
struct TreeNode { string val; TreeNode* _lchild; TreeNode* _rchild; }
从功能上来讲,有左子树,右子树,值节点就够了。所谓的树节点,本身就是一个指针而已, 不需要单独定义。 子树也可以看做一个完整的二叉树。
你自己实现具体功能的时候就能体会到为什么这么写了。书上的意思是把根节点单独拿出来,这样就造成两个类,其实个人觉得没有必要,一个节点类就够了,使用时用节点类定义root就可以。一个写法而已,答案哪有唯一的。但是你写的就不对了。你的实现,搞三个指针,我觉得你不是要指向父节点,指向父节点的时候可以多设一个指针。而你这里其实有其余两个存在,root就没有存在的必要了。说明白点就是,你的树的普通结点(非根节点)里的root是干嘛的,有左右儿子指针不就行了吗。