迭代的方式来遍历树(前序中序后序)百度一面

秒速五厘米 2022-11-29 05:52 187阅读 0赞

递归的方式来进行遍历树很简单。
但是通过迭代的方式遍历树。
首先
中序遍历
中序遍历就主要在于先走到最左节点,然后从这个节点进行左中右的顺序。因为到了最左的节点也要往回走,而为了支持这个回溯类似的方式,用来保存数据,进入一个下一个节点的就通过换一个节点继续从开头(所有左部分节点压入)

code:

  1. void PreOrderWithoutRecursion1(BTNode* root)
  2. {
  3. if (root == NULL)
  4. return;
  5. node* p = root;
  6. stack<node*> s;
  7. while (!s.empty() || p)
  8. {
  9. //
  10. while (p)
  11. { //如果是前序遍历,就是在这里进行操作。
  12. s.push(p);
  13. p = p->lchild;
  14. }
  15. //当p为空时,说明根和左子树都遍历完了,该进入右子树了
  16. if (!s.empty())
  17. {
  18. p = s.top();
  19. s.pop();
  20. cout<<p->data; //如果是中序;在这里输出
  21. p = p->rchild;
  22. }
  23. }
  24. cout << endl;
  25. }

不同的是后序遍历
用一个保存上一个节点 ,
先完全进入左节点,然后判断当前节点的右边节点是不是空 || 当前节点是不是上一个节点,就是已经访问过了

  1. //后序遍历
  2. void PostOrderWithoutRecursion(BTNode* root)
  3. {
  4. if (root == NULL)
  5. return;
  6. stack<BTNode*> s;
  7. BTNode* pCur, *pLastVisit;
  8. pCur = root;
  9. pLastVisit = NULL;
  10. //先把pCur移动到左子树最下边
  11. while (pCur)
  12. {
  13. s.push(pCur);
  14. pCur = pCur->lchild;
  15. }
  16. while (!s.empty())
  17. {
  18. //走到这里,pCur都是空,并已经遍历到左子树底端(看成扩充二叉树,则空,亦是某棵树的左孩子)
  19. pCur = s.top();
  20. s.pop();
  21. //一个根节点被访问的前提是:无右子树或右子树已被访问过
  22. if (pCur->rchild == NULL || pCur->rchild == pLastVisit)
  23. {
  24. cout << pCur->data;
  25. //修改最近被访问的节点
  26. pLastVisit = pCur;
  27. }
  28. else
  29. {
  30. s.push(pCur);
  31. //进入右子树,且可肯定右子树一定不为空
  32. pCur = pCur->rchild;
  33. while (pCur)
  34. {
  35. s.push(pCur);
  36. pCur = pCur->lchild;
  37. }
  38. }
  39. }
  40. cout << endl;
  41. }

发表评论

表情:
评论列表 (有 0 条评论,187人围观)

还没有评论,来说两句吧...

相关阅读