当前位置:   article > 正文

二叉树的层次遍历+每一层单行输出_二叉树层序遍历,单独输出每一层的

二叉树层序遍历,单独输出每一层的

给定一棵二叉树,要求按层次遍历该二叉树,每一层将单独输出一行

难点就在于每一层的结点输出一行。


本着鄙视递归的潜意识,先用迭代来做,递归的做法放在最后。

类似于广度优先遍历,故采用队列 做为辅助记忆结构。

  1. struct TreeNode
  2. {
  3. int val;
  4. struct TreeNode *left;
  5. struct TreeNode *right;
  6. TreeNode(int x) :val(x), left(nullptr), right(nullptr) {}
  7. };

本题的难点就在于每一层要单独一行输出。对此,叶劲峰提出了一个算法,其主要特点是在 队列中每一层的最后一个节点之后插入一个傀儡节点,当我们遇到一个傀儡节点时,就输出换行符,因为此时我们知道已经遍历了一层,要开始新的一层了。

叶劲峰的方法比较好地解决了换行判断的问题。但空间复杂度还有下降的空间。我们记k为所有层中的结点最多的那一层的结点数,则他的算法的空间复杂度为O(k+logN)。k一般都为N/2,即空间复杂度为O(N/2+logN)。若给定的N个结点的树高度为N,则其空间复杂度为O(1.5N)。

能不能换种方法,在同样简便的情况下,使空间复杂度在最坏的情况下只有O(0.5N)?

答案是该方法是存在的。

方法说起来很简单,只要仔细想,应该都能想出这种方法来。

定义两个变量curLevelCount和nextLevelCount来分别保存当前层和下一层的结点数。

显然,curLevelCount的初始值为1,因为只有一个根结点,而nextLevelCount由于未知,故置为0.

  1. void levelOrder(TreeNode* root)
  2. {
  3. if(nullptr == root)
  4. return nullptr;
  5. int curLevelCount = 1, nextLevelCount = 0;
  6. std::queue<int> q;
  7. q.push(root);
  8. TreeNode* curPtr = nullptr;
  9. while(!q.empty())
  10. {
  11. curPtr = q.front();
  12. q.pop();
  13. std::cout << curPtr->val << " ";
  14. curLevelCount--;
  15. if(nullptr != curPtr->left)
  16. {
  17. q.push(curPtr->left);
  18. nextLevelCount++;
  19. }
  20. if(nullptr != curPtr->right)
  21. {
  22. q.push(curPtr->right);
  23. nextLevelCount++;
  24. }
  25. if(0 == curLevelCount)
  26. {
  27. endl(std::cout);
  28. curLevelCount = nextLevelCount;
  29. nextLevelCount = 0;
  30. }
  31. }
  32. }

迭代方法结束。

下面开始讲解递归的方法。

递归解法就有一点无脑了。

我们用一个形参来表示当前层数,指定层数的结点才输出。

既然需要指定层数,我们就要获取给定树的高度。因为给定的二叉树并不一定是完全二叉树,所以即使给定了结点总数,也不能直接计算出树的高度。

  1. //计算指定树的高度
  2. int getTreeHeight(TreeNode* root)
  3. {
  4. if(nullptr == root)
  5. return 0;
  6. int leftHeight = getTreeHeight(root->left);
  7. int rightHeight = getTreeHeight(root->right);
  8. return std::max(leftHeight, rightHeight)+1;
  9. }
  1. void printNodeAtLevel(TreeNode* root,int level)
  2. {
  3. if(nullptr == root || level < 0 )
  4. return;
  5. if(0 == level)
  6. {
  7. std::cout << root->val << " ";
  8. return;
  9. }
  10. // 左子树的 level - 1 级
  11. printNodeAtLevel(root->left, level - 1);
  12. // 右子树的 level - 1 级
  13. printNodeAtLevel(root->right, level - 1);
  14. }
  15. void levelOrder(const TreeNode* root)
  16. {
  17. if(nullptr == root)
  18. return;
  19. int totalLevel = getTreeHeight(root);
  20. for(int i = 0; i < totalLevel; i++)
  21. {
  22. printNodeAtLevel(root, i);
  23. endl(std::cout); //打印完一层,换行
  24. }
  25. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/446931
推荐阅读
相关标签
  

闽ICP备14008679号