后序遍历

数据结构 树(上)

不打扰是莪最后的温柔 提交于 2019-12-08 05:02:32
数据结构 树(上) 一、概述   主要内容包含树的基本概念、二叉树(平衡二叉树、完全二叉树、满二叉树)、搜索树(二叉搜索树、平衡搜索树、AVL树、伸展树、(2,4)树、红黑树)、(a,b)树、B树等实际运用的树数据结构 二、基本知识(树的定义和属性) 1、树(非线性数据结构)运用于一些算法实现的效率会比线性数据结构(基于数组的列表和链表)快,广泛运用于文件系统目录结构、图形用户界面、MySQL数据库索引、网站、路由协议和其他计算机系统中 2、树T定义为存储一系列元素的有限节点集合,这些节点具有 parent-children 关系且满足属性:一、如果树T不为空,则它一定具有一个称为根节点 r 的特殊节点,并且该节点没有父节点;二、每个非根节点 v 都具有唯一的父节点 w ,每个具有父节点 w 的节点都是节点 w 的一个孩子 3、一个没有孩子的节点 v 称为外部节点或者叶子节点,一个有一个或多个孩子的节点 v 称为内部节点 4、树的边:一对具有父子关系的节点(u,v);树的路径:一系列节点,这些节点中任意两个连续的节点都具有父子关系 5、节点P的祖先:从根节点到该节点P所经路径上的所有节点;节点P的子孙:以该节点P为根节的子树中任意一个节点都是节点P的子孙 6、有序树:如果树中的每个节点的孩子节点都有特定的顺序,称为有序树。有序树:二叉树、霍夫曼树(信息编码)、B树

开发中常见的算法汇总一览

心已入冬 提交于 2019-12-07 22:00:39
我们知道计算机中各类应用程序随处可见的,而支撑这些应用程序运行的就是各类数据结构以及各类算法,这就是经典等式 程序=数据结构+算法 ,上一篇幅中我们列举了一些常用的数据结构,那么今天我们来捋一捋日常开发中常见的一些算法思想以及具体算法各自的特性及相关指标 文章目录 常见算法思想 穷举法(Brute Force) 核心思想 特性 适用问题或算法 分治法(Divide and Conquer) 核心思想 特性 适用问题或算法 贪心算法(Greedy) 核心思想 特性 适用问题或算法 动态规划法(Dynamic Programming) 核心思想 特性 适用问题或算法 回溯法(Backtracking) 核心思想 特性 适用问题或算法 分枝界限法(Branch and Bound) 关于递归(画外音) 贪心和动态规划(画外音) 常见的算法分类 排序算法 冒泡排序 插入排序 希尔排序 选择排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 排序算法总结 查找算法 顺序查找 二分查找 散列查找 二叉树查找 搜索算法 树的层次遍历 树的(前/中/后)序遍历 常见算法思想 我们首先介绍下几种常见的算法思想,日常中一些具体的解题算法的思想都依赖于它们,文中列举一些具体算法问题可以自行通过搜索引擎了解 穷举法(Brute Force) 核心思想 顾名思义就是列举出所有可能出现的情况

二叉树的遍历小记

◇◆丶佛笑我妖孽 提交于 2019-12-06 14:23:39
二叉树前中后序的遍历的小总结:   其中在用栈实现前后序的遍历过程中,后续遍历可以看成前序遍历来实现,只是路径的方向正好和前序遍历相反,即从根节点的右标记点为起始,左标记点为终点,取得的结果取逆序就为后续遍历的结果,通过后续遍历的图一目了然。 来源: https://www.cnblogs.com/yysumer/p/11989595.html

二叉树的前中后序遍历

我们两清 提交于 2019-12-06 13:53:53
面试题:二叉树的前中后序遍历 二叉树的前中后遍历,其前中后,您可理解为指的是根结点所在的序。 前序遍历:前序遍历的顺序为根-左-右中序遍历:中序遍历的顺序为左-根-右后序遍历:后序遍历的顺序为左-右-根层次遍历: 从上到下,每一个层次从左到右 前序遍历 import java.util.ArrayList;import java.util.List;import java.util.Stack;/** * Given a binary tree, return the preorder traversal of its TreeNodes' values. */public class Lc144 { /* * 前序遍历 :根左右 思路;将当前节点压入栈中,一直遍历左子树知道当前节点为空,向上弹出遍历一下右子树。 */ public static List<Integer> preorderTraversal(TreeNode root) { Stack<TreeNode> stack = new Stack<>(); List<Integer> list = new ArrayList<>(); TreeNode curr = root; while (curr != null || !stack.isEmpty()) { while (curr != null) { list

leetcode 145. 二叉树的后序遍历

混江龙づ霸主 提交于 2019-12-06 12:59:54
给定一个二叉树,返回它的 后序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 1 //递归算法 2 class Solution { 3 public List<Integer> postorderTraversal(TreeNode root) { 4 List<Integer> list = new ArrayList<Integer>(); 5 if(root==null) return list; 6 postorder(root,list); 7 return list; 8 } 9 public List<Integer> postorder(TreeNode node,List<Integer> list){ 10 if(node.left!=null)postorder(node.left,list); 11 if(node.right!=null)postorder(node.right,list); 12 list.add(node.val); 13 return list; 14 } 15 } 16 //迭代算法 17 class Solution { 18 public List<Integer> postorderTraversal(TreeNode root) { 19 List<Integer> list

二叉树的前中后序遍历

此生再无相见时 提交于 2019-12-06 09:48:27
面试题:二叉树的前中后序遍历 二叉树的前中后遍历,其前中后,您可理解为指的是根结点所在的序。前序遍历:前序遍历的顺序为根-左-右中序遍历:中序遍历的顺序为左-根-右后序遍历:后序遍历的顺序为左-右-根 1.前序遍历 思路:利用栈后进先出的特性。1.根结点入栈;2.循环取栈顶元素、右子结点入栈、左子结点入栈。JAVA参考代码public class TreeNode { int val; TreeNode left; TreeNode right;​ TreeNode(int val) { this.val = val; }}public List<Integer> preorderTree(TreeNode root) { Stack<TreeNode> stack = new Stack<>(); List<Integer> preorder = new ArrayList<>();​ if (root == null) { return preorder; }​ stack.push(root); while (!stack.empty()) { TreeNode node = stack.pop(); preorder.add(node.val); if (node.right != null) { stack.push(node.right); } if (node

20182315 第十周学习总结

a 夏天 提交于 2019-12-06 05:37:13
学号 20182315 《数据结构与面向对象程序设计》第10周学习总结 教材学习内容总结 第十周主要讲图的相关构成,因此我的学习思路是:依次学习图的类别,图得实现方法,图的遍历,最优图。 图的类别:图可分为有向图,无向图,带权图。顾名思义,无向图即为节点与节点之间没有方向。有向图的节点与节点之间有方向。带权图节点与节点之间的边有意义,其边有权值。 图得实现方法:图的实现方法有连接表,连接矩阵。连接矩阵本质上是一个二维数组,分为横向和纵向两个方向。可以以横向到纵向定义节点方向。连接表即为二维数组,数组头为每一个结点,后序结点为与数组头连接的结点。 图的遍历:图的遍历较为复杂,分为广度优先遍历与深度优先遍历。 (1)广度优先遍历:广度优先遍历要用到队列知识存放结点和MashMap来确定是否访问过此结点, 将起始点存入队列中,将其标记为以访问存入MashMap中。在将结点从队里取出,搜索该结点所连接的结点,将他们存入队中,设为以访问。再将他们依此取出进行上述操作,直到队列里没有需要操作的数字。 (2)深度优先遍历:广度优先遍历用栈来代替队列,因为他有先进先出的特性,另外,深度优先遍历直到结点进入迭代器将其设为已访问。 图的连接性:图得连接性可通过遍历来体现,如果图是全部连接起来的,那无论通过哪个节点进行遍历,遍历结点的结果都是一样的。如果不连通,那必定有一个结点的遍历结果为1。

二叉树的迭代遍历以及递归遍历

痴心易碎 提交于 2019-12-06 05:08:14
二叉树的前序遍历(递归版): public ArrayList<Integer> inOrder(TreeNode root ){ ArrayList<Integer> result = new ArrayList<Integer>(); if(root == null){ return result; } result.add(root.val); inOrder(root.left);+ inOrder(root.right); return result; } 二叉树的中序遍历(递归版): public ArrayList<Integer> inOrder(TreeNode root ){ ArrayList<Integer> result = new ArrayList<Integer>(); if(root == null){ return result; } inOrder(root.left); result.add(root.val); inOrder(root.right); return result; } 二叉树的后续遍历(递归版): public ArrayList<Integer> inOrder(TreeNode root ){ ArrayList<Integer> result = new ArrayList<Integer>(); if(root =

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

北慕城南 提交于 2019-12-06 04:37:16
最近在学习数据结构,从书上的代码示例中学习到了一种抽象的思考方式,记录一些学习二叉树的感悟 先序遍历 先序遍历相对简单,我一开实现的时候考虑了四种情况 左孩子为空 && 右孩子为空 访问根节点,然后出栈 左孩子不为空 && 右孩子为空 访问根节点,然后继续访问左孩子 左孩子为空 && 右孩子不为空 访问根节点,入栈右孩子,出栈 左孩子不为空 && 右孩子不为空 访问根节点,入栈右孩子,继续访问左孩子 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-05 21:44:33
输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。 思路一: 中序遍历为增长数组,判断是否矛盾 思路二: 如5、7、6、9、11、10、8 代码编写具体思路: 1.找到第一个大于根节点的数,即9,所以9之后的为右子树 2.如果右子树的值都大于根节点8,则符合 3.递归法分别判断是否左子树和右子树都符合这种特点。 package com.lifeibigdata.algorithms.blog; import java.util.Arrays; /** * * 5、7、6、9、11、10、8 * 8 / \ 6 10 / \ / \ 5 7 9 11 */ public class SearchTree { public static void main(String[] args) { // int[] a = {5,7,6,9,11,10,8}; //true int a[] = {7, 4, 6, 5} ; //false System.out.println(searchTree(a,a.length)) ; } static boolean searchTree(int[] a,int length){ if (a == null || length <= 0){ return false; } boolean flag