Inorder Tree Traversal | Iterative & Recursive
来源:互联网 发布:ubuntu安装桌面环境 编辑:程序博客网 时间:2024/06/05 07:32
遍历树|迭代和递归
给定一个二叉树,编写迭代和递归解决方案来遍历使用顺序遍历的树。
不同于以线性顺序遍历的链表,一维数组和其他线性数据结构,可以以多种方式以深度优先顺序(in-order, pre-order and post-order)或宽度优先遍历树订单(级别遍历)。除了这些基本遍历之外,各种更复杂或混合的方案是可能的,例如深度限制搜索,如迭代深化深度优先搜索。
遍历树包括以某种方式遍历所有节点。由于树不是线性数据结构,所以从给定的节点可能会有多个可能的下一个节点,因此一些节点必须被延迟,以某种方式存储以备后续访问。遍历可以迭代地进行,其中延迟节点存储在堆栈中,或者可以通过递归完成延迟节点隐式存储在调用堆栈中。
对于按顺序遍历(非空)二进制树,我们必须对从树的根节点开始的每个节点N做这三件事:
(L)递归地遍历其左子树。当这个步骤完成后,我们再次返回N。
(N)过程N本身
(R)递归地遍历其右子树。当这个步骤完成后,我们再次返回N。
在正常的顺序遍历中,我们在右子树之前访问左子树。如果在访问左子树之前访问右子树,则将其称为反向顺序遍历。
在处理任何节点之前我们可以看到,左子树先处理,后跟节点,最后处理右子树。可以为每个节点递归地定义这些操作。递归实现被称为深度优先搜索(DFS),因为搜索树在进入下一个兄弟之前尽可能地加深每个孩子的深度。
C ++实现 -
//递归函数执行树的顺序遍历 void inorder(Node *root) { //如果当前节点为空,则返回 if (root == nullptr) return; //遍历左子树 inorder(root->left); //显示根(或当前节点)的数据部分 cout << root->data << " "; //遍历正确的子树 inorder(root->right); }
迭代实现 -
要将上述递归过程转换为迭代过程,我们需要一个显式堆栈。下面是一个简单的基于堆栈的迭代算法来进行顺序遍历。
iterativeInorder(node) s -> empty stack while (not s.isEmpty() or node -> null) if (node -> null) s.push(node) node -> node.left else node -> s.pop() visit(node) node -> node.right
C ++实现 -
//迭代函数来执行树的顺序遍历 void inorderIterative(Node *root) { //创建一个空堆栈 stack<Node*> stack; //从根节点开始(将当前节点设置为根节点 Node *curr = root; //如果当前节点为空,堆栈也为空,我们就完成 while (!stack.empty() || curr != nullptr) { //如果当前节点不为空,将其推送到堆栈(推迟它) //并移动到其左边的孩子 if (curr != nullptr) { stack.push(curr); curr = curr->left; } else { // else如果当前节点为null,我们从堆栈中弹出一个元素, //打印它,最后将当前节点设置为其对应的子节点 curr = stack.top(); stack.pop(); cout << curr->data << " "; curr = curr->right; } } }
上述解决方案的时间复杂度为O(n),并且程序的空间复杂度为O(n),因为所需的空间与树的高度成比例,在最差情况下可能与树的节点数相等。 。
阅读全文
0 0
- Inorder Tree Traversal | Iterative & Recursive
- Preorder Tree Traversal | Iterative & Recursive
- Postorder Tree Traversal | Iterative & Recursive
- Preorder, Inorder, and Postorder tree Traversal Iterative solutions
- Iterative Tree Traversal
- Inorder - Tree - traverse - recursive and not recursive
- [Leetcode]Iterative preorder, inorder, postorder traversal
- [Leetcode]Binary Tree Iterative Traversal
- [Index]Binary Tree Iterative Traversal
- FTPrep, 94 Binary Tree Inorder Traversal, TODO: recursive 所有/部分 遍历的模版
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal
- session和cookie的区别和联系
- Java实现MD5加密及解密的代码实例分享
- Linux格式化硬盘 常用命令小记
- STM32通过SPI采集DT50 ADS8320数据
- 假币问题 oj41
- Inorder Tree Traversal | Iterative & Recursive
- plsql developer 12 32位 v12.0.1汉化中文版
- HDU 5920Ugly Problem
- SSM整合表单接受--第二天
- 神奇的fans oj40
- linux-1 查看文件类型及统计文件容量信息
- Spring(10)——bean作用范围(二)——自定义scope
- (OOP:Object Oriented Programming)面向对象
- 斐波纳契数列 oj39