【数据结构】非递归遍历二叉树

前端之家收集整理的这篇文章主要介绍了【数据结构】非递归遍历二叉树前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

由于递归时通过栈来实现的,虽然递归代码有时候看起来比较简单,然后递归太深就会造

成栈溢出。所以我们可以通过栈来实现二叉树的非递归遍历。下边看解析:

【先序遍历】



下边看实现代码

  1. void PreOrderTraverseNonR()
  2. {
  3. stack<Node*> s;
  4. Node* cur = _root;
  5. if (cur == NULL)
  6. return;
  7.  
  8. while (cur || !s.empty())
  9. {
  10. while (cur)
  11. {
  12. cout << cur->_data << " ";
  13. s.push(cur);
  14. cur = cur->_left;
  15. }
  16. Node* top = s.top();
  17. s.pop();
  18. cur = top->_right;
  19. }
  20. cout << endl;
  21. }



【中序遍历】


下边给出实现代码:<注明:图片中那是中序遍历,打错了>

  1. <pre name="code" class="cpp">void InOrderTraverseNonR()
  2. {
  3. stack<Node*> s;
  4. Node* cur = _root;
  5. if (cur == NULL)
  6. return;
  7.  
  8. while (cur || !s.empty())
  9. {
  10. while (cur)
  11. {
  12. s.push(cur);
  13. cur = cur->_left;
  14. }
  15. Node* top = s.top();
  16. cout << top->_data<<" ";
  17. s.pop();
  18. cur = top->_right;
  19. }
  20. cout << endl;
  21. }


  1.  


【后序遍历】


下边看代码

  1. void PostOrderTraverseNonR()
  2. {
  3. if (NULL == _root)
  4. return;
  5. Node* prev = NULL;
  6. Node* cur = _root;
  7. stack<Node*> s;
  8. while (cur || !s.empty())
  9. {
  10. while (cur)
  11. {
  12. s.push(cur);
  13. cur = cur->_left;
  14. }
  15. Node* top = s.top();
  16. if (top->_right == NULL || top->_right == prev)
  17. {
  18. cout << top->_data << " ";
  19. prev = top;
  20. s.pop();
  21. }
  22. else
  23. {
  24. cur = top->_right;
  25. }
  26. }
  27. cout << endl;
  28. }

猜你在找的数据结构相关文章