遍历

树的常见操作Java版

佐手、 提交于 2019-12-12 16:41:45
转: http://memewry.iteye.com/blog/1490721 据说面试中树考到的概率很高 package com.gengu.树; import java.util.Queue; import java.util.Stack; import java.util.concurrent.ConcurrentLinkedQueue; import org.junit.Test; /** * 这里测试树的相关算法 * 1:构造一个树 * 2:先序遍历 * 3:中序遍历 * 4:后序遍历 * 5:层次遍历 * 6:打印某一层二叉树的所有节点 * 7:求高度 * 8:求最远的节点 * 9:判断一个树是不是平衡二叉树 * */ class Node{ public int value; public Node left; public Node right; public Node(int value){ this.value = value; } } public class TestTree { public static Node root = new Node(9); public static Node value1 ; public static Node value2 ; /** * 创建一颗二叉树 * */ public static void

C#-中FCL迭代器模式的一点问题

戏子无情 提交于 2019-12-12 10:53:09
C#中FCL迭代器模式的一点问题 迭代器模式是GOF23种模式中的一种,目的是为了提供对集合的遍历。为什么要实现迭代器模式: 假设存在一个数组,我们的遍历模式可能是采用依据索引来进行遍历。又假设存在一个HashTable,我们的遍历模式就可能按照键值来进行遍历。无论是哪个集合,如果它们的遍历没有一个公共的接口,那么我们的客户端进行调用的时候,相当于是对具体类型进行了编码。这样以来,当需求变化的时候,就必须修改我们的代码。并且,由于客户端代码过多的关注了集合的内部实现,代码的可移植性就会变得很差,这直接违反了面向对象中的开闭原则。于是,迭代器模式就诞生了。现在,不要管FCL中是如何实现该模式的,我们先来实现一个我们自己的迭代器模式。 代码清单: public class Program { static void Main(string[] args) { //使用接口IMyEnumerable代替MyList IMyEnumerable list = new MyList(); //得到迭代器,在循环中针对迭代器编码,而不是集合MyList IMyEnumerator enumerator = list.GetEnumerator(); for (int i = 0; i < list.Count; i++) { object current = enumerator

理解ES6中的Iterator

浪尽此生 提交于 2019-12-12 00:15:20
一、为什么使用Iterator 我们知道,在ES6中新增了很多的特性,包括Map,Set等新的数据结构,算上数组和对象已经有四种数据集合了,就像数组可以使用forEach,对象可以使用for...in.. 进行遍历一样,是不是随着Map和Set的出现也应该给这两种集合一个遍历方法呢?如果这样的话js的方法对象就太多了,既然这四种集合都是需要遍历的,那么完全可以用一个统一的访问机制。于是乎Iterator应运而生。 二、Iterator是什么   Iterator是一个访问机制,同时 是一个接口 ,可以实现在不同的数据集合中,完成它的功能。    Iterator本质是一个指针对象 ,其中包含一个next方法,这个方法可以改变指针的指向,并且返回一个包含value和done的对象,value为当前所指向的成员的值,done表示是否遍历完成。通过这些描述,我们大致可以手写一个Iterator,用于遍历数组: // 定义遍历器对象 let Iterator = function (arr) { let index = 0; // 当前指针 return { next() { return index < arr.length ? {value: arr[index++],done: false} : {value: undefined, done: true}; } } }; let

Python学习课堂笔记:寻找重复的子树

怎甘沉沦 提交于 2019-12-11 23:23:07
本期的Python学习课堂笔记:寻找重复的子树 题目: 给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意 一棵 的根结点即可。 两棵树重复是指它们具有相同的结构以及相同的结点值。 示例 1: 1 / \ 2 3 / / \ 4 2 4 / 4 下面是两个重复的子树: 2 / 4 和 4 因此,你需要以列表的形式返回上述重复子树的根结点。 解题思路: 这就是一道考察二叉树遍历的题, 遍历的时候序列化作为 String 类型存入 Map, 若其为第二次出现即将该结点加入数组. 代码: 这里以后序遍历为例, 需要注意叶子结点应当规定一个特殊字符作为替代 null 结点, 这里用的是 ‘#’ Java: class Solution { public List<TreeNode> findDuplicateSubtrees(TreeNode root) { List<TreeNode> list = new ArrayList<>();//待返回数组 if (root == null) return list; Map<String, Integer> map = new HashMap<>();//哈希映射查找重覆子结点 traverse(root, map, list, ""); return list; } //后序遍历 private String

JQuery中的几种遍历方法

别说谁变了你拦得住时间么 提交于 2019-12-11 23:06:36
这是body要遍历的对象 <ul id="city"> <li>北京</li> <li>上海</li> <li>天津</li> <li>重庆</li> </ul> 第一种:JS中的for循环方法 var cities = $("#city li");//获取city标签下的所有li标签体, for (var i = 0; i < cities.length; i++) { alert(cities[i].innerHTML);//获得集合中的每个元素对象的html } 第二种:Jq对象集合.each(function(){}) var cities = $("#city li");//先获取city标签下的所有li标签体对象 cities.each(function () { alert(this.innerHTML);//this就是代表集合在集合中的对象.缺点是不能获取索引 }); cities.each(function (index,element) {//传入了两个参数, // alert(index+":"+element.innerHTML);//遍历cities中的每个对象, // alert(index+":"+$(element).html());//遍历cities中的每个对象,和上一行类似 if("上海"==$(element).html()){

二叉搜索树结点最小距离

此生再无相见时 提交于 2019-12-11 22:07:07
给定一个二叉搜索树的根结点 root, 返回树中任意两节点的差的最小值。 示例: 输入: root = [4,2,6,1,3,null,null] 输出: 1 解释: 注意,root是树结点对象(TreeNode object),而不是数组。 给定的树 [4,2,6,1,3,null,null] 可表示为下图: 4 / \ 2 6 / \ 1 3 最小的差值是 1, 它是节点1和节点2的差值, 也是节点3和节点2的差值。 注意: 二叉树的大小范围在 2 到 100。 二叉树总是有效的,每个节点的值都是整数,且不重复。 思路:中序遍历,因为搜索二叉树中序遍历后是升序的,所以最小差值一定存在于中序中相邻的结点之间;刚开始我用的后序遍历,当访问到根结点是此时计算根结点与左右子树结点的差值,此时会出现一个问题,比如:最小的差值不存在于任意结点与其左右子树之间,而是存在于根结点与左子树的最右结点之间(或根结点与其右子树的最左结点之间),此时无法正确的得出结果。 code1:中序遍历时把结点加入vector中,然后找出数组中相邻结点的最小差值 code2:中序遍历,边遍历,边求解 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;

C语言——二叉树的基本操作

て烟熏妆下的殇ゞ 提交于 2019-12-11 19:55:37
程序需求 1.内容包括二叉链表的结构描述。 2.二叉树的建立。 3.二叉树的先序、中序与后序遍历算法。 先序遍历:先访问根节点,再先序遍历左子树,最后先序遍历右子树 中序遍历:先中序遍历左子树,再访问根节点,最后中序遍历右子树 后序遍历:先后序遍历左子树,再后序遍历右子树,最后访问根节点 4.建立二叉树,并通过调用函数。 5.输出先序遍历、中序遍历与后序遍历的结果。 算法的基本思想 根据题目要求,采用二叉链表来存储二叉树结构,二叉树是非线性数据集结构,通过遍历可以把二叉树中的结点访问一次且一次,从而得到顺序序列。 先序遍历: 1.先访问根节点 2.再先序遍历左子树 3.最后先序遍历右子树 中序遍历: 1.先中序遍历左子树 2.再访问根节点 3.最后中序遍历右子树 后序遍历: 1.先后序遍历左子树 2.再后序遍历右子树 3.最后访问根节点 程序的流程 程序由三个模块组成: 1.输入模块:输入二叉树的扩展,就要先进行二叉树的扩展,也就是将二叉树每个结点的空指针引出一个虚结点,其值为一个特定值,比如“ ”。用“ ”来表示空子树,处理后的二叉树称为原二叉树的扩展二叉树。 2.计算模块:设计先序PreOrder,中序InOrder,后序PostOrder遍历函数,进行函数调用二叉树结点排序。 3.输出模块:输出三种遍历结果。 二叉树遍历 # include <stdio.h> #

数据结构与算法简记--二叉树

十年热恋 提交于 2019-12-11 18:45:06
二叉树(Binary Tree) 树 根节点、父节点、兄弟节点、叶子节点 高度、深度、层的概念 二叉树 顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子节点和右子节点,并不要求都要有二个节点,有的只有左节点,有的只有右节点 满二叉树 图中编号2的二叉树,叶子节点全都在最底层,除了叶子节点之外,每个节点都有左右两个子节点,这种二叉树就叫作满二叉树 完全二叉树 图中编号3的二叉树,叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大,这种二叉树叫作完全二叉树 如何表示(或者存储)一棵二叉树? 链式存储法 顺序存储法 基于数组 如果节点 X 存储在数组中下标为 i 的位置, 下标为 2 * i 的位置存储的就是左子节点, 下标为 2 * i + 1 的位置存储的就是右子节点。 反过来,下标为 i/2 的位置存储就是它的父节点。通过这种方式,我们只要知道根节点存储的位置(一般情况下,为了方便计算子节点,根节点会存储在下标为 1 的位置),这样就可以通过下标计算,把整棵树都串起来。 适用于完全二叉树 ,如果是非完全二叉树会浪费空间; 堆就是完全二叉树,且常使用数组存储数据 二叉树的遍历 前序遍历--访问顺序: 父节点 --》左子节点--》右子节点 中序遍历--访问顺序:左子节点--》 父节点 --》右子节点 后序遍历--访问顺序

JS中的迭代器和生成器

*爱你&永不变心* 提交于 2019-12-11 18:38:55
利用迭代器生成一个遍历方法: let arr1 = [1, 2, 3, 11, 22, 13, 24]; function forOf(arr, callback) { // 找到迭代器函数 let iterator = arr[Symbol.iterator]; // 调用迭代器函数(注意this指向),得到迭代器对象 let it = iterator.call(arr); let obj; // 迭代器的方法next();返回一个对象:value:指向每一项,done:boolean。(是否遍历完,完成过后值为true) while (!(obj = it.next()).done) { callback(obj.value); } } forOf(arr1, (v) => console.log(v + 1));//遍历输出数组arr1中每一项的值+1。 生成器函数: function* yield function* genFn() { console.log(555); yield 444; console.log(666); yield 666; console.log(777); } //生成器函数调用得到生成器: let gen = genFn(); console.log(gen.next()); console.log(gen.next()); console

JS的ES6的iterator

我怕爱的太早我们不能终老 提交于 2019-12-11 17:52:39
一.iterator 1.概念:iterator是一种接口机制,为各种不同的数据结构提供统一的访问机制。 2.作用: 为各种数据结构,提供一个统一的、简便的访问接口; 使得数据结构的成员能够按某种次序排列。 ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费。 3.工作原理: 创建一个指针对象,指向数据结构的起始位置。 第一次调用next方法,指针自动指向数据结构的第一个成员 接下来不断调用next方法,指针会一直往后移动,直到指向最后一个成员 每调用next方法返回的是一个包含value和done的对象,{value: 当前成员的值,done: 布尔值} value表示当前成员的值,done对应的布尔值表示当前的数据的结构是否遍历结束。 当遍历结束的时候返回的value值是undefined,done值为false 4.原生具备iterator接口的数据(可用for of遍历) Array arguments set容器 map容器 String ...... 1 let arr = [1,2,3]; 2 3 for (let i of arr) { 4 console.log(i); 5 6 } 7 8 let obj = { 9 name: 'obj1' 10 } 11 12 console.log(arr); /