二叉树的递归和非递归遍历方法
来源:互联网 发布:centos 挂载u盘 编辑:程序博客网 时间:2024/06/09 17:57
二叉树的遍历方法分三种:前序,中序和后序。前序遍历:根,左子树,右子树;中序遍历:左子树,根,右子树;后序遍历:左子树,右子树,根;
//二叉树的递归前序遍历void PreOrder(BtNode *ptr){ if(ptr != NULL) { printf("%c ",ptr->data); PreOrder(ptr->leftchild); PreOrder(ptr->rightchild); }}//二叉树的递归中序遍历void InOrder(BtNode *ptr){ if(ptr != NULL) { InOrder(ptr->leftchild); printf("%c ",ptr->data); InOrder(ptr->rightchild); }}//二叉树的递归后序遍历void PastOrder(BtNode *ptr){ if(ptr != NULL) { PastOrder(ptr->leftchild); PastOrder(ptr->rightchild); printf("%c ",ptr->data); }}
二叉树的非递归调用主要是利用栈先进后出的特点遍历整个树,将需要打印的结点在栈内进行出栈和入栈操作。
//非递归前序遍历void NicePreOrder(BtNode *ptr){ if(ptr == NULL) return ; Init_Stack(&st); push(&st,ptr); //将根节点入栈 while(!empty(&st)) //当栈为空时,表示整个树遍历完成 { ptr = top(&st); pop(&st); printf("%c ",ptr->data); //第一次将根节点打印 if(ptr->rightchild != NULL)//为了让左孩子先打印,要将右孩子的元素放在栈底 push(&st,ptr->rightchild); if(ptr->leftchild != NULL) push(&st,ptr->leftchild); }}//非递归中序遍历void NiceInOrder(BtNode *ptr){ if(ptr == NULL) return ; Stack st; Init_Stack(&st); while(ptr != NULL || !empty(&st)) { while(ptr != NULL) { push(&st,ptr); //先将左子树遍历并入栈,最后一个入栈的即为最左边的孩子节点 ptr = ptr->leftchild; } ptr = top(&st); pop(&st); //将最左边的孩子节点出栈 printf("%c ",ptr->data); ptr = ptr->rightchild; //返回到与最左孩子的父节点,开始遍历其右孩子节点 }}//非递归后序遍历void NicePastOrder(BtNode *ptr){ if(ptr == NULL) return ; Stack st; // BtNode *; Init_Stack(&st); BtNode *tag = NULL; while(ptr != NULL || !empty(&st)) { while(ptr != NULL) { push(&st,ptr); ptr = ptr->leftchild; } ptr = top(&st); pop(&st); //先出最左孩子结点 if(ptr->rightchild == NULL || ptr->rightchild == tag) //若右孩子被遍历过,则打印该父节点 { printf("%c ",ptr->data); tag = ptr; //tag标志着某个父节点的右孩子是否被遍历 ptr = NULL; //重新生成新的未遍历节点 } else { push(&st,ptr); ptr = ptr->rightchild; } }}
二叉树的遍历主要考虑,左子树,根节点,右子树三者之间的联系,并且保证他们出栈的顺序及规律。
阅读全文
0 0
- 二叉树的遍历 -- 递归和非递归方法
- 二叉树的递归和非递归遍历方法
- 二叉树的递归和非递归遍历方法
- 二叉树的非递归遍历方法
- 非递归的方法遍历二叉树
- 非递归遍历二叉树的方法
- 二叉树的非递归遍历方法
- 二叉树的递归遍历和非递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉搜索树的递归遍历和非递归遍历
- java 二叉树的递归遍历和非递归遍历
- 非递归和递归方法遍历二叉树
- 二叉树遍历,递归和非递归方法
- 递归 和 非递归 遍历二叉树
- 递归和非递归遍历二叉树
- 递归和非递归遍历二叉树
- 二叉树递归和非递归遍历
- 二叉树递归和非递归遍历
- 由YouCompleteMe安装引起一系列问题
- 线程终止方式
- 51nod 1049最大子段和(dp)
- Leetcode-Length of Last Word
- 圆
- 二叉树的递归和非递归遍历方法
- 浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
- 多重背包二进制优化模板
- Mysql学习之路05-连接查询
- 仿真互动粒子(未完成)
- A除以B (20)
- SWIFT网络报文传递流程
- STL源码分析之deque,双端队列(一)
- nignx 负载均衡的几种算法介绍