前序遍历

数据结构之二叉树

梦想与她 提交于 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)后序遍历:先遍历左子树,在遍历右子树,最后输出父节点 总结:看输出父节点的顺序,就确定是前序,中序,后序 分析二叉树的遍历步骤 二叉树的查找

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

力扣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 就分别是它的左右子节点。 根据上面的分析,你就可以画出例子中的二叉树了。 那么我们寻找的顺序是,先从前序遍历的第一个节点开始

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

↘锁芯ラ 提交于 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

LeetCode 589. N叉树的前序遍历(N-ary Tree Preorder Traversal)

我是研究僧i 提交于 2019-12-24 17:53:27
589. N叉树的前序遍历 589. N-ary Tree Preorder Traversal LeetCode 589. N-ary Tree Preorder Traversal 题目描述 给定一个 N 叉树,返回其节点值的前序遍历。 例如,给定一个 3 叉树 : 返回其前序遍历: [1,3,5,6,2,4]。 说明: 递归法很简单,你可以使用迭代法完成此题吗? Java 实现 Iterative Solution import java.util.LinkedList; import java.util.List; import java.util.Stack; class Node { public int val; public List<Node> children; public Node() { } public Node(int _val, List<Node> _children) { val = _val; children = _children; } } class Solution { public List<Integer> preorder(Node root) { List<Integer> result = new LinkedList<>(); if (root == null) { return result; } Stack<Node>

144. 二叉树的前序遍历 C语言

怎甘沉沦 提交于 2019-12-21 08:55:20
题目是经典前序遍历,不同的是要把节点数据存到数组中,并返回 。解题要点就是把数组作为参数代入,随着循环存储节点数据。 int* preorderTraversal(struct TreeNode* root, int* returnSize) { int* ret =NULL; *returnSize=0; backtrack(root, returnSize, &ret); return ret; } void backtrack(struct TreeNode* root, int* returnSize, int** ret) { *ret = realloc(*ret, 4 * ((*returnSize) + 1)); if (root == NULL); else { (*ret)[*returnSize] = root->val; (*returnSize)++; backtrack(root->left, returnSize, ret); backtrack(root->right, returnSize, ret); } } int* preorderTraversal(struct TreeNode* root, int* returnSize) { int* ret = NULL; *returnSize = 0; ret = malloc(4 * 256)