求二叉树的叶子节点
有两种方法都是递归实现
方法一
将先序遍历打印节点改为:先判断是否是叶子节点(左右子树为空)
如果是计数器+1,如果不是则不做处理
遍历到一个非空节点时判断一次
1 先判断根节点
2 在递归遍历左子树
3 在递归遍历右子树
4 子树的遍历过程遵循1~3
5 当为空树时即到达递归的出口
192 void _Treeleaf(TreeNode* root, size_t * size)
193 {
194 if(root==NULL)
195 {
196 //空树
197 return ;
198 }
199 if(size==NULL)
200 {
201 //非法输入
202 return ;
203 } //左右子书为空,即为叶子节点
204 if(root->lchild==NULL&&root->rchild==NULL)
205 {
206 (*count)++;
207 } //递归遍历左右子树并计数
208 _Treeleaf1(root->lchild,count);
209 _Treeleaf1(root->rchild,count);
210 return ;
211
212 }
214 size_t Treeleaf1(TreeNode* root)
215 {
216 if(root==NULL)
217 {
218 return 0;
219 }
220 size_t count=0;
221 _Treeleaf1(&root,&count);
222 return count;
223
224 }
方法二
左子树的叶子节点+右子树的叶子节点
171 size_t Treeleaf(TreeNode* root)
172 {
173 if(root==NULL)
174 {
175 //空树
176 return 0;
177 }
178 size_t count=0;
179 if(root->lchild==NULL&&root->rchild==NULL)
180 {
181 //只有根节点
182 return 1;
183 }
184 //统计左子树
185 size_t lsize=Treeleaf(root->lchild);
186 //统计右子树
187 size_t rsize=Treeleaf(root->rchild);
188 return lsize+rsize;
189 }