前序遍历

二分搜索树(Binary Search Tree)

这一生的挚爱 提交于 2020-04-04 09:12:11
目录 什么是二叉树? 什么是二分搜索树? 二分搜索树的基本操作 二分搜索树添加新元素 二分搜索树的遍历(包含非递归实现) 删除二分搜索树中的元素 什么是二叉树?   在实现二分搜索树之前,我们先思考一下,为什么要有树这种数据结构呢?我们通过企业的组织机构、文件存储、数据库索引等这些常见的应用会发现,将数据使用树结构存储后,会出奇的高效,树结构本身是一种天然的组织结构。常见的树结构有:二分搜索树、平衡二叉树(常见的平衡二叉树有AVL和红黑树)、堆、并查集、线段树、Trie等。Trie又叫字典树或前缀树。   树和链表一样,都属于动态数据结构,由于二分搜索树是二叉树的一种,我们先来说说什么是二叉树。二叉树具有 唯一的根节点 ,二叉树每个节点 最多 有两个孩子节点,二叉树的每个节点 最多有一个父亲节点 ,二叉树具有天然递归结构,每个节点的左子数也是一棵二叉树,每个节点的右子树也是一颗二叉树。二叉树如下图: 什么是二分搜索树?   二分搜索树也是一种二叉树,但二分搜索树种每个节点的值都要大于其左子树所有节点的值,小于其右子树所有节点的值,每一棵子树也是二分搜索树。正因为二分搜索树的这种性质,二分搜索树存储的元素必须具有可比较性。下图就是一棵二分搜索树: 我们可以根据二分搜索树的特点,构建一颗二分搜索树,代码实现如下: /** * 由于二分搜索树中的元素必须具有可比较性

数据结构和算法系列17 图

ε祈祈猫儿з 提交于 2020-04-03 11:49:52
数据结构和算法系列17 图 阅读目录 一,图的定义 二,图相关的概念和术语 三,图的创建和遍历 四,最小生成树和最短路径 五,算法实现 这一篇我们要总结的是图(Graph),图可能比我们之前学习的线性结构和树形结构都要复杂,不过没有关系,我们一点一点地来总结,那么关于图我想从以下几点进行总结: 1,图的定义? 2,图相关的概念和术语? 3,图的创建和遍历? 4,最小生成树和最短路径? 5,算法实现? 回到顶部 一,图的定义 什么是图呢? 图是一种复杂的非线性结构。 在线性结构中,数据元素之间满足唯一的线性关系,每个数据元素(除第一个和最后一个外)只有一个直接前趋和一个直接后继; 在树形结构中,数据元素之间有着明显的层次关系,并且每个数据元素只与上一层中的一个元素(双亲节点)及下一层的多个元素(孩子节点)相关; 而在图形结构中,节点之间的关系是任意的,图中任意两个数据元素之间都有可能相关。 图G由两个集合V(顶点Vertex)和E(边Edge)组成,定义为G=(V,E) 回到顶部 二,图相关的概念和术语 1,无向图和有向图 对于一个图,若每条边都是没有方向的,则称该图为无向图。图示如下: 因此,(V i ,V j )和(V j, V i )表示的是同一条边。注意, 无向图是用小括号,而下面介绍的有向图是用尖括号。 无向图的顶点集和边集分别表示为: V(G)={V 1 ,V 2 ,V

数据结构和算法系列-------- 图

眉间皱痕 提交于 2020-04-03 11:47:50
原文地址 http://www.cnblogs.com/mcgrady/archive/2013/09/23/3335847.html#_label2 阅读目录 一,图的定义 二,图相关的概念和术语 三,图的创建和遍历 四,最小生成树和最短路径 五,算法实现 这一篇我们要总结的是图(Graph),图可能比我们之前学习的线性结构和树形结构都要复杂,不过没有关系,我们一点一点地来总结,那么关于图我想从以下几点进行总结: 1,图的定义? 2,图相关的概念和术语? 3,图的创建和遍历? 4,最小生成树和最短路径? 5,算法实现? 一,图的定义 什么是图呢? 图是一种复杂的非线性结构。 在线性结构中,数据元素之间满足唯一的线性关系,每个数据元素(除第一个和最后一个外)只有一个直接前趋和一个直接后继; 在树形结构中,数据元素之间有着明显的层次关系,并且每个数据元素只与上一层中的一个元素(双亲节点)及下一层的多个元素(孩子节点)相关; 而在图形结构中,节点之间的关系是任意的,图中任意两个数据元素之间都有可能相关。 图G由两个集合V(顶点Vertex)和E(边Edge)组成,定义为G=(V,E) 二,图相关的概念和术语 1,无向图和有向图 对于一个图,若每条边都是没有方向的,则称该图为无向图。图示如下: 因此,(V i ,V j )和(V j, V i )表示的是同一条边。注意, 无向图是用小括号

Leetcode题解——数据结构之树

戏子无情 提交于 2020-03-21 09:06:04
递归 1. 树的高度 2. 平衡树 3. 两节点的最长路径 4. 翻转树 5. 归并两棵树 6. 判断路径和是否等于一个数 7. 统计路径和等于一个数的路径数量 8. 子树 9. 树的对称 10. 最小路径 11. 统计左叶子节点的和 12. 相同节点值的最大路径长度 13. 间隔遍历 14. 找出二叉树中第二小的节点 层次遍历 1. 一棵树每层节点的平均数 2. 得到左下角的节点 前中后序遍历 1. 非递归实现二叉树的前序遍历 2. 非递归实现二叉树的后序遍历 3. 非递归实现二叉树的中序遍历 BST 1. 修剪二叉查找树 2. 寻找二叉查找树的第 k 个元素 3. 把二叉查找树每个节点的值都加上比它大的节点的值 4. 二叉查找树的最近公共祖先 5. 二叉树的最近公共祖先 6. 从有序数组中构造二叉查找树 7. 根据有序链表构造平衡的二叉查找树 8. 在二叉查找树中寻找两个节点,使它们的和为一个给定值 9. 在二叉查找树中查找两个节点之差的最小绝对值 10. 寻找二叉查找树中出现次数最多的值 Trie 1. 实现一个 Trie 2. 实现一个 Trie,用来求前缀和 递归 一棵树要么是空树,要么有两个指针,每个指针指向一棵树。树是一种递归结构,很多树的问题可以使用递归来处理。 1. 树的高度 104. Maximum Depth of Binary Tree (Easy)

二叉树的创建与遍历

怎甘沉沦 提交于 2020-03-21 00:18:04
此时有这样一棵树,其先序遍历:ABCDEFGH;中序遍历:CBEDFAGH;后序遍历:CEFDBHGA;想要以输入结点的方式来创建树。可以考虑一个节点创建成功在创建其左右结点,若其左右结点为空,则返回至上一个结点继续创建,直到创建完毕。 创建树的结点: class BNode{ private BNode leftChild; private BNode rightChild; private char data; public BNode() { } public BNode(char data){ this.data = data; } public BNode(BNode leftChild,BNode rightChild,char data){ this.leftChild = leftChild; this.rightChild = rightChild; this.data = data; } public BNode getLeftChild() { return leftChild; } public void setLeftChild(BNode leftChild) { this.leftChild = leftChild; } public BNode getRightChild() { return rightChild; } public void

589. N叉树的前序遍历

别说谁变了你拦得住时间么 提交于 2020-03-20 03:07:12
给定一个 N 叉树,返回其节点值的 前序遍历 。 例如,给定一个 3叉树 : 返回其前序遍历: [1,3,5,6,2,4] 。 说明: 递归法很简单,你可以使用迭代法完成此题吗? class Solution { public List<Integer> res = new ArrayList<>(); public List<Integer> preorder(Node root) { if(root == null) return res; res.add(root.val); for(Node node : root.children) { preorder(node); } return res; } } /* // Definition for a Node. 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> res = new ArrayList

Java中二叉树的层序遍历

自古美人都是妖i 提交于 2020-03-17 11:08:49
二叉树除了前序遍历、中序遍历、后序遍历之外,还有一种遍历方式,那就是层序遍历,它是将二叉树按照层次进行遍历的一种方法。 首先,需要定义节点类,代码如下: public class TreeNode { int value ; TreeNode left ; TreeNode right ; public TreeNode ( ) { value = 0 ; left = right = null ; } public TreeNode ( int value ) { this . value = value ; left = right = null ; } } 层序遍历 对于代码的实现,我们可以利用队列来实现。 public void leverOrder ( TreeNode root ) { Queue < TreeNode > queue = new LinkedList < > ( ) ; if ( root != null ) { queue . offer ( root ) ; } while ( ! queue . isEmpty ( ) ) { //获取队头元素 TreeNode topNode = queue . poll ( ) ; System . out . print ( topNode . value + " " ) ; //入队孩子节点 if (

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。

无人久伴 提交于 2020-03-16 20:20:55
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 有关树的问题,一般可以考虑使用递归。 方法: 1.先找到根节点 2.通过中序遍历找到左子树和右子树 3.通过递归将左子树和右子树使用同样的方法分解 4.递归出口:前序遍历和中序遍历为空,则返回 注意: 1. Arrays.copyOfRange(arr,begin,end)该函数把字符串的一部分作为一个新字符串并返回,比利用循环复制数组效率要高得多。 2.数组为空和数组长度为0的区别: int[] array = null; 数组为空,此时array不指向任何对象; int[] array = new array[0]; 定义一个长度为0的数组; int[] array = new array[2]; 定义一个长度为2的数组,此时如果数组没有被初始化,默认的值为null; 一般先判断 nums 是否为空,然后再判断长度是否为0,因为可能报空指针异常,一般使用如下方法判断。 if(array == null || array.length == 0) 代码实现: /** * Definition for binary tree *

面试题 28:对称的二叉树

邮差的信 提交于 2020-03-15 23:47:09
题目描述 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3 示例 1: 输入:root = [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root = [1,2,2,null,3,null,3] 输出:false 限制: 0 <= 节点个数 <= 1000 https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/submissions/ 思路 在前序遍历中,是先遍历左子树再遍历右子树的。 可以定义一种与前序遍历对称的遍历,先遍历右子树,再遍历左子树。 这样会发现,只要这两种遍历的结果是一样的,那就是对称的二叉树。 有个例外,对于每个节点的值相同的二叉树,遍历后的结果都是一个树,但不一定是对称的。这时需要将 null 判断也放进来。 7 / \ 7 7 / \ / 7 7 7 如上面的二叉树,两种遍历结果都是 {7, 7, 7, 7, 7, 7},但不是对称的,这时将 null 判断加进来的不一样了。 前序遍历序列为 {7, 7,

589. N叉树的前序遍历

一曲冷凌霜 提交于 2020-03-15 19:52:19
【题目】 给定一个 N 叉树,返回其节点值的 前序遍历 。 例如,给定一个 3叉树 : 返回其前序遍历: [1,3,5,6,2,4] 。 【解析】 """ # Definition for a Node. class Node(object): def __init__(self, val, children): self.val = val self.children = children """ class Solution(object): def preorder(self, root): """ :type root: Node :rtype: List[int] """ ret[] #初始化结果数组 if root is None:return [] #树空的情况返回[],所以这里不能return None #递归时候把该节点加入ret。 root相当于上层的x #有个问题,每次递归会把ret置空,导致最后ret=[] ret.append(root.val) for x in root.children: #这一步很重要,递归时把每一层的ret元素联合起来 ret.extend(self.preorder(x)) return ret 来源: https://www.cnblogs.com/remly/p/10137142.html