【C/C++练习题】从上到下打印二叉树

举报
王建峰 发表于 2021/11/19 00:56:25 2021/11/19
【摘要】 《剑指Offer》面试题32     题目一 从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。   思路 利用队列的先入先出,来完成二叉树按层级打印节点信息。队列中存储二叉树的节点指针,首先将根节点入队,再将根节点出队打印,同时将左右子节点指针入队。这样每次从队列取节点,打...

《剑指Offer》面试题32

 

 

题目一

从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。

 

思路

利用队列的先入先出,来完成二叉树按层级打印节点信息。队列中存储二叉树的节点指针,首先将根节点入队,再将根节点出队打印,同时将左右子节点指针入队。这样每次从队列取节点,打印节点,左右子节点入队,最终完成将所有节点按层打印。

 

代码


  
  1. /******************************************************************************
  2. * 函数介绍:不分行从上到下打印二叉树
  3. * 输入参数:pTreeRoot 二叉树根节点指针
  4. * 输出参数:无
  5. * 返回值:true 成功 , false 传入参数无效
  6. * 备注:无
  7. ******************************************************************************/
  8. bool Print_level_order(BinaryTreeNode* pTreeRoot)
  9. {
  10. if (NULL == pTreeRoot)
  11. {
  12. return false;
  13. }
  14. queue<BinaryTreeNode*> nodes; //构造一个队列nodes
  15. //1.将根节点地址入队
  16. nodes.push(pTreeRoot);
  17. while(!nodes.empty())
  18. {
  19. //2.取出节点指针,并打印节点信息
  20. BinaryTreeNode* pNode = nodes.front();
  21. cout << pNode->m_nValue << ",";
  22. //3.节点指针出队
  23. nodes.pop();
  24. //4.将左右子节点分别入队
  25. if(pNode->m_pLeft != NULL)
  26. {
  27. nodes.push(pNode->m_pLeft);
  28. }
  29. if(pNode->m_pRight != NULL)
  30. {
  31. nodes.push(pNode->m_pRight);
  32. }
  33. }
  34. return true;
  35. }

 

 

题目二

从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。
 

思路

在之前的基础上,设置两个变量,分别用于纪录下一层节点的个数和当前层待打印节点的个数

 

代码


  
  1. /******************************************************************************
  2. * 函数介绍:分行从上到下打印二叉树
  3. * 输入参数:pTreeRoot 二叉树根节点指针
  4. * 输出参数:无
  5. * 返回值:true 成功 , false 传入参数无效
  6. * 备注:无
  7. ******************************************************************************/
  8. bool Print_level_order(BinaryTreeNode* pTreeRoot)
  9. {
  10. if (NULL == pTreeRoot)
  11. {
  12. return false;
  13. }
  14. queue<BinaryTreeNode*> nodes; //构造一个队列nodes
  15. int next_level = 0; //下一层的节点个数
  16. int level_num = 1; //当前层待打印的节点数
  17. //1.将根节点地址入队
  18. nodes.push(pTreeRoot);
  19. while(!nodes.empty())
  20. {
  21. //2.取出节点指针,并打印节点信息
  22. BinaryTreeNode* pNode = nodes.front();
  23. cout << pNode->m_nValue << " ";
  24. //3.节点指针出队
  25. nodes.pop();
  26. --level_num;
  27. //4.将左右子节点分别入队,并统计下一层节点数next_level
  28. if(pNode->m_pLeft != NULL)
  29. {
  30. ++next_level;
  31. nodes.push(pNode->m_pLeft);
  32. }
  33. if(pNode->m_pRight != NULL)
  34. {
  35. ++next_level;
  36. nodes.push(pNode->m_pRight);
  37. }
  38. //5.打印分行
  39. if (level_num == 0)
  40. {
  41. cout << endl;
  42. level_num = next_level;
  43. next_level = 0;
  44. }
  45. }
  46. return true;
  47. }

 

 

题目三

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

 

分析

使用两个栈stack1、stack2来完成,先将根节点push到stack1,然后弹出打印。将根节点的左子节点和右子节点分别push到stack1,从stack1中弹出元素打印;同时将下一层的右子节点和左子节点分别push压入栈stack2中(当第二层节点从stack1中pop完,此时第三层的节点也压入stack2完成)。。直到stack1、stack2栈空,完成打印。

 

代码


  
  1. /******************************************************************************
  2. * 函数介绍:之字形打印二叉树
  3. * 输入参数:pTreeRoot 二叉树根节点指针
  4. * 输出参数:无
  5. * 返回值:true 成功 , false 传入参数无效
  6. * 备注:无
  7. ******************************************************************************/
  8. bool Print_level_order(BinaryTreeNode* pTreeRoot)
  9. {
  10. if (NULL == pTreeRoot)
  11. {
  12. return false;
  13. }
  14. stack<BinaryTreeNode*> levels[2]; //构造一个队列nodes
  15. int current = 0;
  16. int next = 1;
  17. //1.将根节点地址入队
  18. levels[current].push(pTreeRoot);
  19. while (!levels[0].empty() || !levels[1].empty())
  20. {
  21. //2.从栈中弹出元素并打印
  22. BinaryTreeNode* pNode = levels[current].top();
  23. levels[current].pop();
  24. cout << pNode->m_nValue << " ";
  25. if (current == 0)
  26. {
  27. if (pNode->m_pLeft != NULL)
  28. levels[next].push(pNode->m_pLeft);
  29. if (pNode->m_pRight != NULL)
  30. levels[next].push(pNode->m_pRight);
  31. }
  32. else
  33. {
  34. if (pNode->m_pRight != NULL)
  35. levels[next].push(pNode->m_pRight);
  36. if (pNode->m_pLeft != NULL)
  37. levels[next].push(pNode->m_pLeft);
  38. }
  39. if (levels[current].empty())
  40. {
  41. cout << endl;
  42. current = 1 - current;
  43. next = 1 - next;
  44. }
  45. }
  46. return true;
  47. }

 

 

源码链接:https://gitee.com/hinzer/sword_to_offer/tree/master/questions

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/99438445

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。