中序遍历

LeetCode-105、从前序与中序遍历序列构造二叉树-中等

ε祈祈猫儿з 提交于 2020-01-10 00:31:51
LeetCode-105、从前序与中序遍历序列构造二叉树-中等 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 代码: # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode: if not preorder: return None val = preorder[0] tmp = TreeNode(val) ind = inorder.index(val) tmp.left = self.buildTree(preorder[1:ind+1], inorder[:ind]) tmp.right = self.buildTree(preorder[ind+1:],

数据结构基础温故-4.树与二叉树(上)

孤者浪人 提交于 2020-01-09 00:33:45
前面所讨论的线性表元素之间都是一对一的关系,今天我们所看到的结构各元素之间却是一对多的关系。树在计算机中有着广泛的应用,甚至在计算机的日常使用中,也可以看到树形结构的身影,如下图所示的Windows资源管理器和应用程序的菜单都属于树形结构。树形结构是一种典型的 非线性 结构,除了用于表示相邻关系外,还可以表示层次关系。本文重点讨论树与二叉树的基本结构和遍历算法等内容。 一、好大一棵树,绿色的祝福 1.1 树的基本概念 Defination: 树(Tree)是 n(n≥0)个结点的有限集。n=0时,该树被称为“空树”。如上图所示,A点称为根节点,它有两棵子树,分别以B、C为根,而以C为根的子树又可以分成两棵子树。   1.2 树的基本术语   (1)不同的节点:根节点、内部节点、叶子节点以及节点的 度    (2)节点的关系:双亲与孩子,爸爸回来了,爸爸去哪儿?   (3)节点的层次:结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。树中结点的最大层次称为树的 深度 (Depth)或 高度 。 二、二叉树又是个什么鬼 2.1 从猜数字游戏引出二叉树   回忆一下,当年某电视节目中会让游戏参与者猜一个产品的价格,如果参与者在限定时间内猜对了,那么他就可以获得这个产品。很多人都是一点点的提高数值来猜,但是这样猜会很没有效率。因此

重建二叉树

房东的猫 提交于 2020-01-08 18:18:58
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 树中的基本结构,有遍历和递归两种方式来实现: 1、前旬遍历:先中,后左,最后右。-巧记:根左右 2、中旬遍历:先左,后中,最后右。-巧记:左根右 3、后旬遍历:先左子节点,后右子节点,最后中间根节点。-巧记:左右根 如何遍历树? —— DO GET。 题:输入二叉树的前序遍历和中序遍历结果,重建该二叉树。 待. 来源: oschina 链接: https://my.oschina.net/u/4432600/blog/3154983

数据结构——二叉树的遍历

不羁岁月 提交于 2020-01-06 16:07:13
二叉树的先序遍历、中序遍历和后序遍历的递归算法,二叉树的非递归算法。 1、括号表示法创建二叉树 2、实现二叉树的递归遍历算法和非递归遍历算法(非递归算法选做),依次输出二叉树的先序、中序和后序遍历序列 3、二叉树的遍历遍历二叉树,输出结点值大于C的结点,而小于等于C的结点用*替代 4、遍历二叉树,输出结点值小于D的结点,而大于等于D的结点用*替代 main.cpp # include <malloc.h> # include <stdio.h> # include <iostream> using namespace std ; typedef char ElemType ; //Visit函数,对每个节点进行的访问 //需设置函数返回值类型 typedef void Status ; Status DispLargeThanC ( ElemType e ) //该函数输出树中大于C的字符 { if ( e > 'C' ) { printf ( "%2c" , e ) ; } else { printf ( "%2c" , '*' ) ; } } Status DispLessThanD ( ElemType e ) //该函数输出树中小于D的字符 { if ( e < 'D' ) { printf ( "%2c" , e ) ; } else { printf ( "%2c" ,

【洛谷1030】求先序遍历

白昼怎懂夜的黑 提交于 2020-01-03 10:40:15
原题: 给出一棵二叉树的中序与后序排列。求出它的先序排列。 性质: 1.三序遍历的序列中,同一子树的所有节点不留空隙地组成一个区间,即对于任意子树,存在一个区间使得区间内每个点都恰好是子树中的一个节点 2.中序遍历序列中,在一个子树的区间中,子树根节点左边的区间是左子树区间,右边的区间是右子树区间 3.后序遍历序列中,一个子树区间内,子树根节点左边是右子树区间,再左边是左子树区间 4.由上可以推出在某个字数区间中,后序遍历标号最大的节点是根节点 那么可以递归,参数为中序遍历序列中子树的区间端点,每次在子树区间中找到后序遍历标号最大的点,即子树根节点,然后递归处理左右子树区间 代码:(题目中不同节点用不同大写字母表示) 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int s[110000],t[110000],n,m; 5 int iod[110000],pstod[110000]; 6 void gtprod(int l,int r){ 7 if(l>r) return ; 8 int mx=0; 9 for(int i=l;i<=r;++i)if(pstod[s[i]]>pstod[s[mx]]) 10 mx=i; 11 printf("%c",s[mx]-1+'A'); 12 gtprod(l

力扣105——从前序与中序遍历序列构造二叉树

三世轮回 提交于 2020-01-02 11:21:23
原题 根据一棵树的前序遍历与中序遍历构造二叉树。 注意:你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 原题url:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 解题 这道题目,主要就是在于大家对于二叉树这个数据结构的熟悉程度了,根据其前序遍历和中序遍历,推算出原本的二叉树。 我们想想,如果不是写代码,只是通过手写的话,我们是如何查找的,就用题目给出的例子: 根据前序遍历,第一个一定是根节点,那么 3 就是根节点。 从中序遍历中寻找 3,在它左边的,都是其左子树上的节点,在它右边的,都是其右子树上的节点。 因为中序遍历中,3 的左边只有9,那么 9 就是 3 的左子节点。 根据前序遍历 先根然后左子节点,然后再右子节点 的规律,3 、9 之后的 20 一定是 3 的右子节点。 20 在中序遍历中,其左右两边就是 15 和 7,因此15 和 7 就分别是它的左右子节点。 根据上面的分析,你就可以画出例子中的二叉树了。 那么我们寻找的顺序是,先从前序遍历的第一个节点开始

94. 二叉树的中序遍历

雨燕双飞 提交于 2020-01-02 08:05:14
中序递归&&非递归 递归方法: /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List < Integer > inorderTraversal ( TreeNode root ) { List < Integer > rev = new ArrayList < Integer > ( ) ; inorder ( root , rev ) ; return rev ; } public void inorder ( TreeNode root , List < Integer > list ) { if ( root != null ) { inorder ( root . left , list ) ; list . add ( root . val ) ; inorder ( root . right , list ) ; } } } 非递归方法: public class Solution { public List < Integer > inorderTraversal (

二叉树栈实现前中后序遍历(易理解的方法)

↘锁芯ラ 提交于 2019-12-29 19:32:47
说明:首先你需要看懂用栈实现中序遍历的代码,理解其思想: 从根节点开始入栈,找到他的左子树入栈.....一直到他的左子树为空了,左边到头了,取出当前根节点的值,从栈中取出当前根节点 然后找他的右子树继续入栈,找左子树入栈.....,直到右边取完了这时候一个节点就遍历完了,然后继续从栈中取上一个节点继续 其实考虑下为什么用栈呢?就是用他来回溯的要回溯到根节点,对于中序遍历:左中右,我按照右中左的顺序先后入栈里就可以了,然后每次循环取出栈顶节点也就是左子树作为根节点,取他的左右子树入栈,就可以了 实现: package com.bysj.common.算法; import java.util.ArrayList; import java.util.List; import java.util.Stack; public class 二叉树 { static class ColorNode { TreeNode node; Boolean isContinue; public ColorNode(TreeNode node, Boolean isContinue) { this.node = node; this.isContinue = isContinue; } } public static List<Integer> inorderTraversal(TreeNode root)

二叉树遍历python

大憨熊 提交于 2019-12-25 13:45:32
二叉树遍历有先序遍历中序遍历和后序遍历 以下遍历以该二叉树为例: 3.1 前序遍历   思想:先访问根节点,再先序遍历左子树,然后再先序遍历右子树。总的来说是根—左—右   上图先序遍历结果为为:   代码如下: def PreOrder ( self , root ) : '''打印二叉树(先序)''' if root == None : return print ( root . val , end = ' ' ) self . PreOrder ( root . left ) self . PreOrder ( root . right ) 3.2 中序遍历   思想:先中序访问左子树,然后访问根,最后中序访问右子树。总的来说是左—根—右   上图中序遍历结果为为:   代码如下: def InOrder ( self , root ) : '''中序打印''' if root == None : return self . InOrder ( root . left ) print ( root . val , end = ' ' ) self . InOrder ( root . right ) 3.3 后序遍历   思想:先后序访问左子树,然后后序访问右子树,最后访问根。总的来说是左—右—根   上图后序遍历结果为为:   代码如下: def BacOrder (

数据结构和算法之二叉树

可紊 提交于 2019-12-25 07:09:26
一、为什么需要树这种数据结构 是因为之前的数组和链表两种存储结构对增删改查都各有利弊,而且差异明显。所以树这种结构就是增删改查效率差异不是很明显,增删改查所耗费时间都比较均衡的一种数据结构。 1、数组存储方式 1.1、优点 通过下标方式访问元素,速度快 。对于有序数组,还可以使用 二分查找 来提高检索速度。 1.2、缺点 若检索具体某个值,或 插入值(按一定顺序),会整体移动 。效率较低。 2、链表存储方式 2.1、优点 在一定程度上对数组存储方式进行了优化(比如插入一个节点,只需要将插入节点连接到链表中即可,删除效率也很好) 2.2、缺点 在进行检索时,效率仍然很低,比如检索某个值,需要从头节点开始遍历进行判断。 3、树存储方式 3.1、说明 可以利用 二叉排序树(Binary Sort Tree) ,既可以保证数据的检索速度,同时也可以保证数据的插入、删除、修改的速度。 二叉排序树就是要求任何 左侧 子节点的值都大于当前父节点, 右侧 子节点的值都小于当前父节点。 3.2、案例 3.2.1、假设有一颗二叉排序树【8 4 11 2 6 10 13】,如下图所示 二叉排序树, 左侧 子节点的值都大于当前父节点, 右侧 子节点的值都小于当前父节点。 3.2.2、如下需求 3.2.2.1、查找10 具体步骤: 总共需要两次查找 1、判断10与根节点大小,大于根节点,在右侧查找 2