数据结构《11》----二叉树遍历的非递归版本(栈)
来源:互联网 发布:高清电视网络机顶盒 编辑:程序博客网 时间:2024/05/17 23:31
二叉树的前序,中序,后序遍历的非递归版本有许多种。
较为简单的是采用栈,来模拟递归。
此外,还可以采用标记,或者父亲指针来实现。这些算法都需要 O(n)的空间,
还有一类算法仅仅需要常数的空间即可。如 Morris 遍历 http://blog.csdn.net/shoulinjun/article/details/19051503
前序和中序相对比较简单,代码仅仅相差一行。后序相对比较复杂,需要记录右子树是否已经访问。
前序遍历:
void PreOrderVisitStack(struct TreeNode * root){ stack<TreeNode*> s; while(root != NULL || !s.empty()) { while(root){ cout << root->value << " "; s.push(root); root = root->left_child;}if(!s.empty()){ root = s.top(); s.pop(); root = root->right_child;} }}
void InOrderVisitStack(TreeNode *root){ stack<TreeNode*> s; while(root != NULL || !s.empty()) { while(root){ s.push(root); root = root->left_child;}if(!s.empty()){ root = s.top(); s.pop(); cout << root->value << " "; root = root->right_child;} }}
后序遍历:
用 pre 记录前一个访问的节点,如果 root 的右孩子是 pre 或者 NULL, 说明右子树已经访问,这时访问 root 即可。
void PostOrderVisitStack(TreeNode *root){ stack<TreeNode*> s; TreeNode *pre(NULL); //前一部访问的节点 while(root || !s.empty()) { while(root){ s.push(root); root = root->left_child;}if(!s.empty()){ root = s.top(); s.pop(); // right_child already visited if(root->right_child == pre || root->right_child == NULL){ cout << root->value << " ";pre = root;root = NULL; } else{ s.push(root); root = root->right_child; }} }//end while}
5 0
- 数据结构《11》----二叉树遍历的非递归版本(栈)
- 数据结构《12》----二叉树遍历的非递归版本(不用栈)
- 【数据结构】二叉树的遍历(递归与非递归)
- 数据结构 二叉树的非递归遍历
- 数据结构:二叉树的非递归遍历
- 二叉树的非递归遍历-数据结构
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 数据结构--非递归遍历二叉树(利用辅助栈)
- [数据结构] 二叉树的递归与非递归遍历
- 二叉树遍历的递归与非递归版本
- 二叉树的前序中序后序遍历 - 递归&非递归版本
- 数据结构之二叉树遍历(递归和非递归)
- 数据结构-二叉树(包含递归和非递归版本)
- 【数据结构】 二叉树 非递归遍历
- 数据结构-非递归遍历二叉树
- 数据结构--二叉树遍历非递归实现
- 【数据结构】非递归遍历二叉树
- 数据结构-非递归遍历二叉树
- Working Practice-让每日例会成为一个没有压力的论坛
- 开始搞个android定位demo(2)高德
- 1009. 范围统计
- 友元函数和友元类
- linux守护进程编程
- 数据结构《11》----二叉树遍历的非递归版本(栈)
- Cache-Control
- 1000. MJ, Nowhere to Hide
- 1001. 统计数字
- 1001. 统计数字
- java笔记(5)--反射
- 1002. Stick
- 1002. Stick
- NSMutableURLRequest POST