中序遍历

4-树篇

天大地大妈咪最大 提交于 2019-12-09 15:09:23
题一:【重建二叉树】输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 分析:根据示例可以知道,前序遍历序列第1个为根节点,再根据中序遍历序列可以得到根节点的左右子树{472},{5386};由前序遍历左子树{2 4 7}可以直到左子树根节点为2,再根据中序遍历左子树{472}可以再次分为左右子树……依次递推; 拓展: Arrays.copyOfRange(arr, i , j );复制数组,包括索引i,不包括索引j; 1 /** 2 * Definition for binary tree 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 import java.util.Arrays; 11 public class Solution { 12 public TreeNode reConstructBinaryTree(int [] pre,int [] in) { 13 if(pre

【题解】求后序遍历

给你一囗甜甜゛ 提交于 2019-12-09 14:21:06
题目描述 输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。 输入输出格式 输入格式: 共两行: 第一行为一个字符串,表示树的先序遍历; 第二行为一个字符串,表示树的中序遍历。 树的结点一律用小写字母表示。 输出格式: 一行,表示树的后序遍历序列。 输入输出样例 输入样例: abdec dbeac 输出样例: debca 这道题就是一道简单的模板题 首先可以设置一个index索引表,存放这棵树的每个字母在前序遍历中排哪个位置 可以这么想: 先在前序遍历中找出根,就是在index表中最小的那一个 然后就可以把这棵树的根找出来,分为两个子树 如图: 然后递归这个做法就可以了! 附代码: #include<iostream> #include<string> using namespace std; string pre,mid; int index[127]; void dfs(int low,int high) { if(low>high) return; int min=2147483647,root=0; for(register int i=low;i<=high;++i) { if(index[mid[i]]<=min) { min=index[mid[i]]; root=i; } } dfs(low,root-1); dfs(root+1,high); cout<

数据结构 树(上)

不打扰是莪最后的温柔 提交于 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 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

二叉树的前中后序遍历

此生再无相见时 提交于 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

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

痴心易碎 提交于 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-06 03:29:30
public class Solution { int i=0; public TreeNode reConstructBinaryTree(int [] pre,int [] in) { return constructBiTree(pre,in,0,pre.length-1); } public TreeNode constructBiTree(int pre[],int in[],int start,int end){ if(start>end) return null; TreeNode node = new TreeNode(pre[i]); int index=Location(pre[i],in); i++; if(i>=pre.length) return node; node.left=constructBiTree(pre,in,start,index-1); node.right=constructBiTree(pre,in,index+1,end); return node; } public int Location(int target,int in[]){ int i=0; for( i=0;i<in.length;i++){ if(target==in[i]) break; } return i; } } 来源: https://my.oschina

判断一个数组是否为后序遍历结果

落花浮王杯 提交于 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