求二叉树的叶子节点【数据结构】

求二叉树的叶子节点
有两种方法都是递归实现
方法一

    将先序遍历打印节点改为:先判断是否是叶子节点(左右子树为空)
    如果是计数器+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 }

猜你喜欢

转载自blog.csdn.net/yu876876/article/details/80943762