二叉树的三种遍历递归法和非递归法(前序、中序、后续)
来源:互联网 发布:贪心算法题目 编辑:程序博客网 时间:2024/05/06 09:00
二叉树的前序遍历:根->左->右
1、递归方法:
思路:我们知道递归就是将一个大问题不断分成子问题进行处理,当达到递归终止条件时,跳出。因此在前序遍历中我们把每一个节点分成三部分,即:根节点、左子树、右子树。
例如下面这个二叉树递归过程:
转化成代码代码:
void PrevOrder() //1、递归法 { Node* root = _Root; _PrevOrder(root);}void _PrevOrder(Node* root){ if (root) { cout<<root->_Data<<endl; _PrevOrder(root->_Left); _PrevOrder(root->_Right); }}
2、非递归法
思路:不用递归去遍历,我们如何获得上个节点的信息呢??这里,我们可以建立一个栈,这个栈用于保存每次化成子问题的根结点。
例如下面这个二叉树非递归过程:
代码:
void PrevOrderNonR() //2、非递归法(利用栈的思想){ Node* cur = _Root; stack<Node*> s; while (!s.empty() || cur) { while(cur) { cout<<cur->_Data<<" "; s.push(cur); cur = cur->_Left; } Node* top = s.top(); s.pop(); cur = top->_Right; }}
二叉树的中序遍历:左->根->右
1、递归方法:
void InOrder() //中序递归遍历{ _InOrder(_root); cout << endl;}void _InOrder(Node* root){ if (root != NULL) { _InOrder(root->_left); cout << root->_data << " "; _InOrder(root->_right); }}
2、非递归方法:
void InOrderNoR() //中序非递归遍历 { stack<Node*> s; Node* cur = _root; while (cur || !s.empty()) { while (cur) { s.push(cur); cur = cur->_left; } Node* top = s.top(); cout << top->_data << " "; s.pop(); cur = top->_right; } cout << endl; }
二叉树的后序遍历:左->右->根
1、递归方法:
void PostOrder() //后续递归{ _PostOrder(_root); cout << endl;} void _PostOrder(Node* root){ if (root != NULL) { _PostOrder(root->_left); _PostOrder(root->_right); cout << root->_data << " "; }}
2、非递归方法:
void PostOrderNoR() //后续非递归{ stack<Node*> s; Node* cur = _root; Node* prev = NULL; while (cur || !s.empty()) { while (cur) { s.push(cur); cur = cur->_left; } Node* top = s.top(); if (top->_right == NULL || top->_right == prev) { cout << top->_data << " "; prev = top; s.pop(); } else { cur = top->_right; } } cout << endl;}
阅读全文
0 0
- 二叉树的三种遍历递归法和非递归法(前序、中序、后续)
- 递归和非递归俩种方法实现二叉树的前序、中序、后续遍历
- 二叉树的前序、中序、后续遍历,递归、非递归实现
- leetcode | 二叉树的前序遍历、中序遍历、后续遍历的非递归实现
- 二叉树的前序遍历、中序遍历、后续遍历 (包括递归、非递归,共六种)
- 二叉树的先序、中序、后续遍历的递归和非递归实现
- 二叉树的非递归前序,中序,后续遍历实现
- 二叉树的创建 先序 中序 后续 递归和非递归遍历
- 【Java语言学习】之递归、非递归前序、中序、后续遍历二叉树
- 二叉树的实现&&递归和非递归方式前序、中序、后续遍历&&发现一个节点中序遍历的下一节点
- 【二叉树】 前序、中序和后序的递归遍历与非递归遍历
- Lintcode 二叉树的前序遍历 (递归和非递归法)
- Java 二叉树的前序、中序、后续遍历 递归和迭代实现
- 二叉树非递归遍历(前序,中序,后续遍序)
- Java实现树的遍历(前序、中序、后续(递归|非递归)、层次)
- 二叉树非递归遍历,不使用栈(前序,中序,后续)
- 递归和非递归实现二叉树的后续遍历
- 二叉树非递归前序和中序遍历
- java间的同步通讯
- 1010: 求圆的周长和面积
- Win7通过U盘安装Linux
- 图像处理之Matlab图像读取
- USACO Section1.2 Palindromic Squares
- 二叉树的三种遍历递归法和非递归法(前序、中序、后续)
- Tensorflow进行深度学习(第二)
- 1011: 圆柱体表面积
- JACOCO的坑【2】
- 【Mysql】Hash索引与Btree索引
- 1012: 求绝对值
- 动态规划——经典例题(一)
- 体系结构—简单工厂模式
- 1013: 求两点间距离