中序遍历

leetcode 94 二叉树的中序遍历(非递归)

荒凉一梦 提交于 2020-01-17 01:09:27
二叉树?中序遍历 题目: 给定一个二叉树,返回它的中序 遍历 例子: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 题目分析 中序遍历: 左子树 根节点 右子树 递归三行解决 非递归? 栈 保存节点信息 解题思路 变量 作用 stack<TreeNode*> s 保存节点信息 TreeNode* temp 表示当前访问节点 过程: 当s非空 取出栈顶元素作为当前节点 temp 栈顶元素出栈 如果当前节点的 右子树节点 非空 ==>入栈 (栈 先进后出 所以先将右子树节点入栈) 如果当前节点的 左子树节点 非空 ==> 1.当前节点temp重新入栈(这样遍历完左子树的时候可以再遍历回根节点) 2.当前左子树的节点入栈 3.将当前节点的 左右子树置为空 (再次遍历的时候就相当于没有左右子树 即根节点输出信息) 代码如下 class Solution { public: vector<int> inorderTraversal(TreeNode* root) { if (!root) return {}; stack<TreeNode*> s{{root}}; vector<int> ans; while(!s.empty()) { TreeNode* temp; temp = s.top(); s.pop(); if (temp->right) s

递归 VS 非递归 内涵

空扰寡人 提交于 2020-01-16 05:13:08
递归与非递归转换的基础知识是能够正确理解三种树的遍历方法:前序,中序和后序,第一篇就是关于这三种遍历方法的递归和非递归算法。 一、为什么要学习递归与非递归的转换的实现方法? 1)并不是每一门语言都支持递归的。 2)有助于理解递归的本质。 3)有助于理解栈,树等数据结构。 二、三种遍历树的递归和非递归算法 递 归与非递归的转换基于以下的原理:所有的递归程序都可以用树结构表示出来。需要说明的是,这个”原理”并没有经过严格的数学证明,只是我的一个猜 想,不过在至少在我遇到的例子中是适用的。学习过树结构的人都知道,有三种方法可以遍历树:前序,中序,后序。理解这三种遍历方式的递归和非递归的表达方 式是能够正确实现转换的关键之处,所以我们先来谈谈这个。需要说明的是,这里以特殊的二叉树来说明,不过大多数情况下二叉树已经够用,而且理解了二叉树的 遍历,其它的树遍历方式就不难了。 1)前序遍历 a)递归方式: void preorder_recursive(Bitree T) /* 先序遍历二叉树的递归算法 */ { if (T) { visit(T); /* 访问当前结点 */ preorder_recursive(T->lchild); /* 访问左子树 */ preorder_recursive(T->rchild); /* 访问右子树 */ } } b)非递归方式 void preorder

【LeetCode】94. 二叉树中序遍历

我的梦境 提交于 2020-01-15 17:04:43
问题描述 Given a binary tree, return the inorder traversal of its nodes' values. Follow up: Recursive solution is trivial, could you do it iteratively? 给定一个二叉树,返回其节点值的顺序遍历。 后续工作:递归解决方案很简单,可以迭代地解决吗? 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] Python 实现 实现一:递归。由于递归调用对内存的使用较多,容易造成栈溢出,实际应用中不建议使用。 class Solution(object): def inorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] """ # Recursively. ret = [] if root == None: return [] if root.left != None: ret += self.inorderTraversal(root.left) ret.append(root.val) if root.right != None: ret += self.inorderTraversal(root.right) return ret

二叉树的建立与遍历(简单操作)

亡梦爱人 提交于 2020-01-14 11:18:49
Description 已知一个按先序序列输入的字符序列,如abc,de,g,f,(其中逗号表示空节点)。请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度。 <o:p></o:p> Input 输入一个长度小于50个字符的字符串。 Output 输出共有4行: 第1行输出中序遍历序列; 第2行输出后序遍历序列; <o:p></o:p>第3行输出叶子节点个数; <o:p></o:p>第4行输出二叉树深度。<o:p></o:p> Sample Input abc,de,g,f, Output cbegdfa cgefdba 3 5 ————————————————————————————————————— 先序遍历,中序遍历,后序遍历 思想一样,只是顺序不同 二叉树高度计算 递归解法: (1)如果二叉树为空,二叉树的深度为0 (2)如果二叉树不为空,二叉树的深度 = max(左子树深度, 右子树深度) + 1 ———————————————————————————————————— # include <bits/stdc++.h> using namespace std ; struct node { char data ; struct node * lt ; //指向根的左子树 struct node * rt ; //指向根的右子树 } ; char

二叉树递归遍历(前序,中序,后序)

谁都会走 提交于 2020-01-13 02:31:25
1.Java 中没有 Tree 的数据结构,不过我们可以自己写一个: public class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; } public TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; } } 2.初始化遍历的树 . TreeNode t4=new TreeNode(4,null,null); TreeNode t8=new TreeNode(8,null,null); TreeNode t6=new TreeNode(6,t4,t8); TreeNode t12=new TreeNode(12,null,null); TreeNode t16=new TreeNode(16,null,null); TreeNode t14=new TreeNode(14,t12,t16); TreeNode t10=new TreeNode(10,t6,t14); 3.前序遍历 public static void preOrder(TreeNode treeNode){

数据结构之二叉树

梦想与她 提交于 2020-01-12 15:07:14
1.为什么需要树这种数据结构 (1)数组储存方式分析: 优点:通过下标的方式访问元素,速度快,对于有序数组,还可以使用二分查找来提高检索速度 缺点:如果要检索某个具体值或者插入值,会整体移动,效率低 (2)链表存储方式分析 优点:在一定程度上对数组储存方式有优化,如插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好 缺点:在进行检索时,效率任然较低. (3)树储存方式分析 能提高数据储存,读取的效率,比如利用二叉排序树(Binary Sort Tree),即可以保证数据的检索速度,同时也可以保证数据的插入删除,修改的速度 树的术语 2.二叉树的概念 1)树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树 2)二叉树的子节点分为左节点和右节点 3)如果该二叉树的所有叶子节点都在最后一层,并且总节点数2^n-1,n是层数,我们称为满二叉树 4)如果还二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称为完全二叉树 二叉树的遍历 : (1)前序遍历:先输出父节点,再遍历左子树和右子树 (2)中序遍历:先遍历左子树,在输出父节点,再遍历右子树 (3)后序遍历:先遍历左子树,在遍历右子树,最后输出父节点 总结:看输出父节点的顺序,就确定是前序,中序,后序 分析二叉树的遍历步骤 二叉树的查找

python-迭代器模式

风流意气都作罢 提交于 2020-01-12 09:09:53
源码地址: https://github.com/weilanhanf/PythonDesignPatterns 说明: 集合是用来管理和组织数据对象的数据结构的。集合有两项基本职能:一、批量的存储数据对象,二、在不暴露集合内部结构的条件下向外界提供访问内部元素的接口(可能存在的遍历方式:顺序、逆序遍历,二叉树的广度优先,先序后序中序遍历等)。要使得集合保持整洁和优雅,而不是说令集合内部包含着各种遍历的方法。因此要求将遍历的方法从集合的指责中分离出来,按照不同的遍历需求分别封装成一个个专门遍历集合内部数据的迭代器。这种思想可以最大限度的减少彼此之间的耦合程度,从而建立一个松散耦合的对象网络。职责分离的要点就是要对分离的职责进行封装,并以抽象对象的方式建立彼此之间的关系。 迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,且不用暴露该对象的内部表示 聚合对象的两个职责: 存储数据,聚合对象的基本职责 遍历数据,既是可变化的,又是可分离的。将遍历数据的行为从聚合对象中分离出来,封装在迭代器对象中。由迭代器来提供遍历聚合对象内部数据的行为,简化聚合对象的设计,更符合单一职责原则。 迭代器模式包含以下4个角色: Iterator(抽象迭代器) ConcreteIterator(具体迭代器) Aggregate(抽象聚合类) ConcreteAggregate(具体聚合类) 实例:

L2-006 树的遍历

雨燕双飞 提交于 2020-01-11 23:39:17
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。 输出格式: 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: 4 1 6 3 5 7 2 #include<bits/stdc++.h> #define INF 0x3f3f3f3f typedef long long ll; using namespace std; const int maxn = 50; int n; typedef struct node { int data; node * lef; node * rig; }node,*tree; void build_tree(int *las,int *mid,int cnt,tree &tre) { if(cnt == 0) { tre = NULL; return; } tre = new node; tre->data = las[cnt - 1]; int i; for(i = 0;mid[i]!=las[cnt - 1];i++); build_tree

二叉树的中序遍历和后序遍历 (Ver. I)

核能气质少年 提交于 2020-01-11 19:40:13
题目描述 按中序遍历和后序遍历给出一棵二叉树,求这棵二叉树中叶子节点权值的最小值。 输入保证叶子节点的权值各不相同。 输入 测试数据有多组 对于每组测试数据,首先输入一个整数N (1 <= N <= 10000),代表二叉树有N个节点,接下来的一行输入这棵二叉树中序遍历的结果,最后一行输入这棵二叉树后序遍历的结果 输入一直处理到文件尾(EOF) 输出 对于每组测试数据,输出一个整数,代表二叉树中叶子节点权值最小值 样例输入 7 3 2 1 4 5 7 6 3 1 2 5 6 7 4 8 7 8 11 3 5 16 12 18 8 3 11 7 16 18 12 5 1 255 255 样例输出 1 3 255 提示 #include<iostream> using namespace std; class BitreeNode { public: int data; BitreeNode *left; BitreeNode *right; BitreeNode() { left=right=NULL; } }; class Bitree { public: BitreeNode *Root; int * inorder; int * pastorder; int len; int Min; Bitree(int n,int *i,int *p) { Min=99999;

leetcode_94.二叉树的中序遍历

自闭症网瘾萝莉.ら 提交于 2020-01-10 11:12:03
给定一个二叉树,返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解析:这个应该是基础中的基础了,建议全文背诵( class Solution { public : vector < int > res ; //递归 vector < int > inorderTraversal ( TreeNode * root , int ) { if ( root ) helper ( root ) ; return res ; } void helper ( TreeNode * root ) { if ( root - > left ) helper ( root - > left ) ; res . push_back ( root - > val ) ; if ( root - > right ) helper ( root - > right ) ; } //非递归 vector < int > inorderTraversal ( TreeNode * root ) { stack < TreeNode * > st ; TreeNode * cur = root ; while ( cur || ! st . empty ( ) ) { if ( cur ) { st .