二叉树前序、中序、后序遍历
2016-04-11 11:20
204 查看
二叉树节点结构
递归版本比较简单,不再叙述,这里讲一下递归版本
先把代码贴出来
前序遍历
前序遍历的过程为中,左,右。即先父结点,再左结点,再右结点。
如图1所示,二叉树的前序遍历结果为ABDGCEF。
前序遍历代码中使用栈S,保存走过的结点。从根节点出发,沿着左孩子走到底。接着弹出栈顶元素,把该结点右孩子赋给当前结点。知道当前结点为空且栈空,结束遍历。
中序遍历
中序遍历的代码跟前序遍历差不多,只是在存结点值时,是在弹栈时存,而不是在沿着左孩子遍历的时候存。图1的中序遍历结果为DGBAECF。
后序遍历
后序遍历是这三个遍历中最复杂的一个。需要一个结点来记录上一次打印过的结点。仍然是从根节点出发沿左孩子走到底。然后判断该结点是否有右孩子,该结点右孩子是否刚刚已经遍历过。如果已经遍历过,则打印当前结点,令记录结点为当前结点,令当前结点为空(因为下一个结点在栈顶)。如果没有遍历过,则令当前结点为当前结点的右孩子。
struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };
递归版本比较简单,不再叙述,这里讲一下递归版本
先把代码贴出来
void preOrder(TreeNode* root, vector<int>& vec) // 前序遍历 { stack<TreeNode*> s; while (!s.empty() || root != NULL) { while (root != NULL) { s.push(root); vec.push_back(root->val); root = root->left; } if (!s.empty()) { root = s.top(); s.pop(); root = root->right; } } } void inOrder(TreeNode* root, vector<int>& vec) // 中序遍历 { stack<TreeNode*> s; while (!s.empty() || !root) { while (root != NULL) { s.push(root); root = root->left; } if (!s.empty()) { root = s.top(); s.pop(); vec.push_back(root->val); root = root->right; } } } void postOrder(TreeNode* root, vector<int>& vec) // 后序遍历 { stack<TreeNode*> s; TreeNode* pre = NULL; while (!s.empty() || !root) { while (root != NULL) { s.push(root); root = root->left; } if (!s.empty()) { root = s.top(); if (root->right != NULL && root->right != pre) { root = root->right; } else { vec.push_back(root->val); pre = root; root = NULL; s.pop(); } } } }
前序遍历
前序遍历的过程为中,左,右。即先父结点,再左结点,再右结点。
如图1所示,二叉树的前序遍历结果为ABDGCEF。
前序遍历代码中使用栈S,保存走过的结点。从根节点出发,沿着左孩子走到底。接着弹出栈顶元素,把该结点右孩子赋给当前结点。知道当前结点为空且栈空,结束遍历。
中序遍历
中序遍历的代码跟前序遍历差不多,只是在存结点值时,是在弹栈时存,而不是在沿着左孩子遍历的时候存。图1的中序遍历结果为DGBAECF。
后序遍历
后序遍历是这三个遍历中最复杂的一个。需要一个结点来记录上一次打印过的结点。仍然是从根节点出发沿左孩子走到底。然后判断该结点是否有右孩子,该结点右孩子是否刚刚已经遍历过。如果已经遍历过,则打印当前结点,令记录结点为当前结点,令当前结点为空(因为下一个结点在栈顶)。如果没有遍历过,则令当前结点为当前结点的右孩子。
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- 文件遍历排序函数
- Lua 学习笔记之C API 遍历 Table实现代码
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- Erlang中遍历取出某个位置的最大值代码
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- php遍历目录方法小结
- 一个目录遍历函数
- php遍历删除整个目录及文件的方法
- PHP遍历文件夹与文件类及处理类用法实例
- PHP遍历XML文档所有节点的方法
- 平衡二叉树
- 二叉树