二叉树的三种非递归遍历

£神魔★判官ぃ 2022-01-11 02:11 326阅读 0赞

【Lehr】【数据结构与算法】【C语言】二叉树的非递归遍历

  • 先序遍历
    • 代码
    • 思路
  • 中序遍历
    • 代码
    • 思路
  • 后序遍历
    • 代码
    • 思路

非递归必会用到栈呐!

先序遍历

代码

  1. void PreOrder(BTNode *b)
  2. {
  3. if(b)
  4. {
  5. //准备一个简单的栈
  6. BTNode* stack[MaxSize];
  7. int top = 0;
  8. BTNode* p = b;
  9. while(p != NULL || top)
  10. {
  11. while(p != NULL)
  12. {
  13. //打印本节点
  14. printf("%c ", p->data);
  15. //栈这样设计是为了让top==0时表示栈空同时拿来当bool判断为否
  16. //存入栈里
  17. stack[++top] = p;
  18. //访问左孩子
  19. p = p -> lchild;
  20. }
  21. //如果左节点不存在
  22. if(top)
  23. {
  24. //找到这个左节点的兄弟右节点
  25. p = stack[top--];
  26. p = p -> rchild;
  27. }
  28. }
  29. }
  30. }

思路

1)访问p节点,并将p节点入栈;
2)如果左节点存在,则让p指向左节点,循环1步骤
3)左节点不在了,则出栈一次,让栈顶元素等于目前节点的亲节点,借此让p指针指向这个左节点的兄弟。
4)如果右节点存在,就继续1,2,3步骤
5)如果右节点不存在,则再次出栈,栈顶元素等于该节点的亲节点的亲节点。
6)直到p指向空且栈空才结束。

中序遍历

代码

  1. void InOrder(BTNode *b)
  2. {
  3. if(b)
  4. {
  5. //准备一个简单的栈
  6. BTNode* stack[MaxSize];
  7. int top = 0;
  8. BTNode* p = b;
  9. while(p != NULL || top)
  10. {
  11. while(p != NULL)
  12. {
  13. //先序是在这里打印的!!!!
  14. //存入栈里
  15. stack[++top] = p;
  16. //访问左孩子
  17. p = p -> lchild;
  18. }
  19. if(top)
  20. {
  21. printf("%c ", p->data);
  22. p = stack[top--];
  23. p = p -> rchild;
  24. }
  25. }
  26. }
  27. }

思路

1)将p节点入栈;
2)如果左节点存在,则让p指向左节点,循环1步骤
3)左节点不在了,则打印该节点并出栈一次,让栈顶元素等于目前节点的亲节点,借此让p指针指向这个左节点的兄弟。
4)如果右节点存在,就继续1,2,3步骤
5)如果右节点不存在,则再次出栈,栈顶元素等于该节点的亲节点的亲节点。
6)直到p指向空且栈空才结束。

与先序唯一的不同就是打印的位置

后序遍历

代码

  1. void PostOrder(BTNode *b)
  2. {
  3. BTNode* stack[MaxSize];
  4. int top = 0;
  5. BTNode *p;
  6. BTNode *pre = NULL;
  7. stack[++top] = b;
  8. while (top)
  9. {
  10. p = stack[top];
  11. if((p->lchild==NULL&&p->rchild==NULL)||(pre!=NULL&&(pre==p->lchild||pre==p->rchild)))
  12. {
  13. printf("%c ", p->data);
  14. top--;
  15. pre = p;
  16. }
  17. else
  18. {
  19. if (p->rchild!=NULL)
  20. {
  21. stack[++top] = p->rchild;
  22. }
  23. if (p->lchild!=NULL)
  24. {
  25. stack[++top] = p->lchild;
  26. }
  27. }
  28. }
  29. }

思路

发表评论

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

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

相关阅读

    相关 ()——

    1、前序遍历 根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同

    相关 实现

    1.二叉树前序遍历的非递归实现 \ 实现思路,先序遍历是要先访问根节点,然后再去访问左子树以及右子树,这明显是递归定义,但这里是用栈来实现的 \ 首先需要先从栈顶取出