前序遍历

二叉树遍历基础 -- 递归与非递归的实现方法

 ̄綄美尐妖づ 提交于 2020-01-25 06:19:57
之前也写过不少关于二叉树的东西了,但是总体来说,二叉树还是一个很绕的东西,所以单独择出来写一篇笔记,之前也没计划什么的,就想到什么写什么吧。不过该篇文章的 主要内容是关于二叉树的三种遍历(前序、中序、后序)不同的实现方式(递归与非递归) 。 首先,我觉得很有必要去彻底理解一下递归。 (1)递归的主体大概分两部分:递归停止的条件、递归内容。 (2)递归应用的实例:这个超级多,就比如最典型的 斐波那契数列 。个人认为,可以用循环实现的,递归基本上都可以实现,但有时递归的效率不如循环。 (3)递归又分为单递归与多递归(二叉树的三种遍历递归方法均用到了双递归!) 根据上面的三点,举个例子先。 假设当x=0时,F(x)=1;否则F(x)=F(n-1)*n。这个时候就可以用递归了,代码实现如下。 class Solution{ public int F(int n) { //递归停止条件 if (n == 0) { return 1; } //递归内容 else { return F(n - 1) * n; } } } 代码分析一下如下: 二叉树的三种遍历:前序(根左右)、中序(左根右)、后序(左右根) 首先看 三种遍历的递归实现方法 。(特点:代码清晰,量少,但不易理解) // (1)前序遍历 public TreeNode PreOrder(TreeNode pRoot) { /

树遍历和非递归

谁说胖子不能爱 提交于 2020-01-25 05:17:13
利用随机函数产生 80 个 ( 不大于 200 且各不相同的 ) 随机整数,用这些整数来生成一棵二树,分别对二叉树进行先序遍历,中序遍历和后序列遍历输出树中结点元素序列。注意:先序遍历输出要求采用非递归来实现。 ( 2 )程序实现的基本思想 1. 建立合适的二叉树 程序是以 图 1.1 的形式建立的。 2. 前序遍历是以 stack 栈和指针左右子女实现的。 3. 前序遍历,中序遍历,后序遍历分别用了递归实现。 4. 如建立二叉树,其中随机产生的数值是( 因为 80 个数比较多,所以就以 #define Max_size 10 ,若要以 80 个数,可 #define Max_size 10 改成 #define Max_size 80 ): 106 199 95 144 102 164 26 96 87 168 由以上数值可以建立出以下的树: 图 1.2 由图 1.2 可得出他们的前序,中序和后序。 前序序列: 106 95 26 87 102 96 199 144 164 168 中序序列: 26 87 95 96 102 106 144 164 168 199 后序序列: 87 26 96 102 95 168 164 144 199 106 ( 3 )系统流程图 程序步骤: #include "stdio.h" #include "conio.h" #define Max

前、中、后序遍历二叉树

喜你入骨 提交于 2020-01-25 01:11:19
后序遍历 后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。即: 若 二叉树 为空则结束返回, 否则: (1)后序遍历左子树 (2)后序遍历右子树 (3)访问根结点 如右图所示 二叉树 后序遍历结果:DEBFCA 中序遍历 中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。若 二叉树 为空则结束返回,否则: (1)中序遍历左子树 (2)访问根结点 (3)中序遍历右子树 如右图所示二叉树,中序遍历结果:DBEAFC 前序遍历 前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问 根结点 ,然后遍历左子树,最后遍历右子树。 若 二叉树 为空则结束返回,否则: (1)访问根结点。 (2)前序遍历左子树 。 (3)前序遍历右子树 。 前序遍历 需要注意的是:遍历左右子树时仍然采用前序遍历方法。 如右图所示 二叉树 前序遍历结果:ABDECF 已知后序遍历和中序遍历,就能确定前序遍历。 来源: CSDN 作者: 这瓜保熟么 链接: https://blog.csdn.net/luzhensmart/article/details/104062758

算法 :重建二叉树

廉价感情. 提交于 2020-01-24 23:30:39
** 题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字 ** public static TreeNode construct(int[] preorder,int[] inorder){ if(preorder == null || inorder == null){ return null; } return constructCore(preorder,0,preorder.length-1,inorder,0,inorder.length-1); } private static TreeNode constructCore(int[] preorder, int startPre, int endPre, int[] inorder, int startIn, int endIn) { if(startPre < endPre || startIn < endIn){ return null; } TreeNode root = new TreeNode(startPre); for(int i = startIn ; i < endIn ; i++){ if(preorder[startPre] == inorder[i]){ //找到之后,分别对左子树和右子树进行递归算法,重复此步骤 root

Morris 遍历

心已入冬 提交于 2020-01-24 06:54:31
1. 二叉树遍历 树是最重要的数据结构之一,而树的遍历是树最基本的操作。 二叉树的遍历一般来说有三种遍历次序: 前序遍历 中序遍历 后序遍历 而这三种遍历次序都可以采用 递归 和 非递归 的方式来完成。 就时间、空间的复杂度来讲,因为非递归需要借助额外的 Stack 来完成操作,所以递归和非递归的时间复杂度都是 O(n) , O(logn) 。 那么有没有另外的不同的二叉树遍历方法,在时间或空间能做到更优的呢?答案是: Morris 遍历 。 由于在遍历的时候,我们需要记住某种遍历次序的的 后驱 或者 前驱 结点,常见的递归和非递归都是采用 栈 的方式完成这个过程,有没有内部空间来记录这些后驱或者前驱结点呢?有,那就是叶结点的左,右孩子结点,因为叶结点的两个孩子结点都是空指针,如果利用好这些空间,我们就可以在 O(1) 的空间完成遍历。 利用叶结点的左、右孩子指向遍历的前驱或者后驱结点,这些指针叫做 线索 ,对应的二叉树叫做 线索二叉树 。 Morris遍历 是使用线索二叉树进行中序遍历的一种实现 ,其可以在 O(n) 的时间, O(1) 的空间完成遍历, 对其稍加修改可以推广到 先序、后序遍历 ,其遍历过程包含三个部分: 创建指向 中序后驱 结点的线索; 遍历输出结点; 删除线索,恢复树的结构; 2. Morris 中序遍历 Morris 中序遍历过程如下:

589. N叉树的前序遍历

人盡茶涼 提交于 2020-01-24 02:51:26
解题思路: 前序遍历是先保存当前节点的值,然后递归遍历其子节点的值。 代码实现如下: /* // Definition for a Node. class Node { public int val; public List<Node> children; public Node() {} public Node(int _val) { val = _val; } public Node(int _val, List<Node> _children) { val = _val; children = _children; } }; */ class Solution { private List<Integer> list=new ArrayList<Integer>(); public List<Integer> preorder(Node root) { if(root==null){ return list; } list.add(root.val); for(Node node:root.children){ preorder(node); } return list; } } 来源: CSDN 作者: 我就是个渴望成长的小菜鸡 链接: https://blog.csdn.net/junjunjiao0911/article/details/104001622

二叉树的前中后序遍历

穿精又带淫゛_ 提交于 2020-01-24 02:21:21
前中后序遍历的递归方式。 其实,前中后序的遍历,走的路径是一样的,只是访问结点的时间不同而已。 非递归进行前中后序遍历(使用栈) 题目描述: List preorderTraversal(TreeNode root) List inorderTraversal(TreeNode root) List postorderTraversal(TreeNode root) 题目链接: https://leetcode-cn.com/problems/binary-tree-preorder-traversal/ https://leetcode-cn.com/problems/binary-tree-inorder-traversal/ https://leetcode-cn.com/problems/binary-tree-postorder-traversal/ 1.前序遍历 public List < Integer > preorderTraversal ( TreeNode root ) { List < Integer > list = new LinkedList < > ( ) ; //迭代解决 使用栈 LinkedList < TreeNode > stack = new LinkedList < > ( ) ; TreeNode tmp = root ; while

LeetCode 144. 二叉树的前序遍历(Binary Tree Preorder Traversal)

一世执手 提交于 2020-01-22 22:48:55
144. 二叉树的前序遍历 144. Binary Tree Preorder Traversal 题目描述 给定一个二叉树,返回它的 前序 遍历。 LeetCode 144. Binary Tree Preorder Traversal 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? Java 实现 Iterative Solution import java.util.LinkedList; import java.util.List; import java.util.Stack; class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> result = new LinkedList<>(); if (root == null) { return result; } Stack<TreeNode> stack = new Stack<>(); stack.push(root); while (

前序与中序遍历序列构造二叉树 中序与后序遍历序列构造二叉树

对着背影说爱祢 提交于 2020-01-22 07:22:29
105. 从前序与中序遍历序列构造二叉树 根据前序遍历和中序遍历,我们可以发现前序遍历的第一个元素就为根元素,在中序遍历中找到这个元素,那么中序遍历中左边为根元素的左子树,右边为右子树,依次递归。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { int len1 = preorder.length-1; int len2 = inorder.length-1; TreeNode root = bulidTree(preorder,0,len1,inorder,0,len2); return root; } public TreeNode bulidTree(int[] preorder, int start1,int end1,int[] inorder,int start2, int end2){ if(start1>end1 || start2>end2){ return

LeetCode--105--从前序与中序遍历序列构造二叉树(python)

こ雲淡風輕ζ 提交于 2020-01-22 06:49:52
根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 1 class Solution: 2 def buildTree(self, preorder, inorder): 3 """ 4 :type preorder: List[int] 5 :type inorder: List[int] 6 :rtype: TreeNode 7 """ 8 def helper(in_left = 0, in_right = len(inorder)): 9 nonlocal pre_idx 10 # if there is no elements to construct subtrees 11 if in_left == in_right: 12 return None 13 14 # pick up pre_idx element as a root 15 root_val = preorder[pre_idx] 16 root = TreeNode(root_val) 17 18 # root splits inorder list 19 # into left