二叉树遍历

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

145. 二叉树的后序遍历

醉酒当歌 提交于 2020-01-01 18:51:20
后序遍历 递归方法: /** * 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 > postorderTraversal ( TreeNode root ) { List < Integer > rev = new ArrayList < Integer > ( ) ; postorder ( root , rev ) ; return rev ; } public void postorder ( TreeNode root , List < Integer > list ) { if ( root != null ) { postorder ( root . left , list ) ; postorder ( root . right , list ) ; list . add ( root . val ) ; } } } 非递归方法: (待续) 任务:总结先序,中序,后序的非递归方法 来源: CSDN 作者: Haha@25 链接: https:/

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

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

23.二叉树的后序遍历序列

戏子无情 提交于 2019-12-23 05:37:41
layout: post post title: 23.二叉树的后序遍历序列 date: 2019-11-08 19:52:44 categories: 剑指offer tags: 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 思路 定义:二叉排序树 ( Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。. 若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值 若它的右子树不空 ,则右子树上所有结点的值均大于宫的根结点的值 它的左、右子树也分别为二叉排序树。 代码 class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.size()==0) return false; return _VerifySquenceOfBST(sequence,0,sequence.size()-1); } bool _VerifySquenceOfBST(vector<int> s,int start,int end) { if(start>=end) return true; int root=s[end]; int i

数据结构基础概念篇

半城伤御伤魂 提交于 2019-12-21 23:46:01
数据结构基础概念篇 原创 小草莓lllll 发布于2017-11-14 13:44:24 阅读数 158267 收藏 更新于2017-11-14 13:44:24 分类专栏: 数据结构与算法 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_31196849/article/details/78529724 展开 <h1 id="数据结构"><a name="t0"></a><a name="t0"></a>数据结构</h1> 一些概念 数据结构就是研究数据的 逻辑结构 和 物理结构 以及它们之间 相互关系 ,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。 数据:所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。 数据元素:数据(集合)中的一个“个体”,数据及结构中讨论的 基本 单位 数据项:数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。 数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等等 逻辑结构:数据之间的相互关系。 集合 结构中的数据元素除了同属于一种类型外,别无其它关系。 线性结构 数据元素之间一对一的关系 树形结构 数据元素之间一对多的关系

二叉树的非递归遍历的思想

痴心易碎 提交于 2019-12-20 18:14:28
最近在学习数据结构,从书上的代码示例中学习到了一种抽象的思考方式,记录一些学习二叉树的感悟 先序遍历 先序遍历相对简单,我一开实现的时候考虑了四种情况 左孩子为空 && 右孩子为空 访问根节点,然后出栈 左孩子不为空 && 右孩子为空 访问根节点,然后继续访问左孩子 左孩子为空 && 右孩子不为空 访问根节点,入栈右孩子,出栈 左孩子不为空 && 右孩子不为空 访问根节点,入栈右孩子,继续访问左孩子 template<typename Elemtype> template<typename Fun> bool BiTree<Elemtype>::PreOrderTraverse(Fun &visit){ Stack<BiTNode<Elemtype>*> S; InitStack<bool,BiTNode<Elemtype>*>(S); BiTNode<Elemtype> *p = root; while (p != nullptr) { visit(p); if(p->rChrilde != nullptr) Push<bool,BiTNode<Elemtype>*>(S,p->rChrilde); if(p->lChrilde != nullptr) p = p->lChrilde; else //如果栈空Pop()返回false,用于判断栈空结束循环 if(!Pop<bool

二叉树的创建遍历和释放

不问归期 提交于 2019-12-19 09:50:59
二叉树的创建遍历和释放 树(Tree)是n(n≥0)个节点的有限集合T,它满足两个条件 : 有且仅有一个特定的称为根(Root)的节点,其余的节点可以分为m(m≥0)个互不相交的有限集合T1、T2、……、Tm,其中每一个集合又是一棵树,并称为其根的子树(Subtree)。 树的基本概念 一个节点的子树的个数称为该节点的度数,一棵树的度数是指该树中节点的最大度数。 度数为零的节点称为树叶或终端节点,度数不为零的节点称为分支节点,除根节点外的分支节点称为内部节点。 一个节点的子树之根节点称为该节点的子节点,该节点称为它们的父节点,同一节点的各个子节点之间称为兄弟节点。一棵树的根节点没有父节点,叶节点没有子节点。 一个节点系列k1,k2, ……,ki,ki+1, ……,kj,并满足ki是ki+1的父节点,就称为一条从k1到kj的路径,路径的长度为j-1,即路径中的边数。路径中前面的节点是后面节点的祖先,后面节点是前面节点的子孙。 节点的层数等于父节点的层数加一,根节点的层数定义为一。树中节点层数的最大值称为该树的高度或深度。 若树中每个节点的各个子树的排列为从左到右,不能交换,即兄弟之间是有序的,则该树称为有序树。一般的树是有序树。 m(m≥0)棵互不相交的树的集合称为森林。树去掉根节点就成为森林,森林加上一个新的根节点就成为树。 树的逻辑结构 树中任何节点都可以有零个或多个直接后继节点

go语言浅析二叉树

自作多情 提交于 2019-12-19 04:47:26
Hello,各位小伙伴大家好,我是小栈君,今天给大家带来的分享是关于关于二叉树相关的知识点,并用go语言实现一个二叉树和对二叉树进行遍历。 我们主要针对二叉树的概念,go实战实现二叉树的前序遍历、中序遍历、后序遍历。 二叉树概念 在计算机科学领域内,二叉树代表的是具有两个节点的树形结构,通常子树被称作为“左子树”,右边的被称作为“右子树”。二叉树通常的应用于实现二叉查找树和二叉堆。 例如上述图片中,我们就制定了一个二叉树,其中d、e、f称作a树的叶子节点。 [叶子结点是离散数学中的概念。一棵树当中没有子结点(即度为0)的结点称为叶子结点,简称“叶子”。 叶子是指出度为0的结点,又称为终端结点] b和c 作为树a的孩子结点,b和a因为作为一个根a的孩子,所以他们的称呼为兄弟结点。其实总结一点就是关于二叉树各个结点的称呼其实和我们在家庭中,对于各个亲戚长辈的称呼类似。 在百度百科中也归纳除了关于二叉树的分类 一棵深度为k,且有2^k-1个结点的二叉树,称为满二叉树。这种树的特点是每一层上的结点数都是最大结点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且或者最后一层是满的,或者是在右边缺少连续若干结点,则此二叉树为完全二叉树。 具有n个结点的完全二叉树的深度为floor(log2n) 1。深度为k的完全二叉树,至少有2k-1个叶子结点,至多有2k-1个结点。