前序遍历

决策树系列三——基尼指数,减枝和

心不动则不痛 提交于 2019-12-03 15:40:02
- - coding: utf-8 - - """ Created on Tue Aug 14 17:36:57 2018 @author: weixw """ import numpy as np 定义树结构,采用的二叉树,左子树:条件为true,右子树:条件为false leftBranch:左子树结点 rightBranch:右子树结点 col:信息增益最大时对应的列索引 value:最优列索引下,划分数据类型的值 results:分类结果 summary:信息增益最大时样本信息 data:信息增益最大时数据集 class Tree: def init (self, leftBranch=None, rightBranch=None, col=-1, value=None, results=None, summary=None, data=None): self.leftBranch = leftBranch self.rightBranch = rightBranch self.col = col self.value = value self.results = results self.summary = summary self.data = data def __str__(self): print(u"列号:%d" % self.col) print(u"列划分值

二叉树前序、中序、后续、广度优先遍历

江枫思渺然 提交于 2019-12-03 04:30:53
二叉树遍历: 有深度遍历和广度遍历,深度遍历有前序、中序以及后序三种遍历方法,广度遍历即我们平常所说的层次遍历。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁,而对于广度遍历来说,需要其他数据结构的支撑,比如堆了。所以,对于一段代码来说,可读性有时候要比代码本身的效率要重要的多。 四种遍历思想: 前序:根–>左子树–>右子树 中序:左子树–>根–>右子树 后序:左子树–>右子树–>根 层次遍历:按层一层层遍历 例如,求下面二叉树的各种遍历 代码实现 首先查看二叉树结构的定义: package com.syj.test.tree; import lombok.Data; /** * Created by syj on 2018/12/25. */ @Data public class BinaryTree { BinaryTree(String val) { this.val = val; } //当前节点值 private String val; //左子树 private BinaryTree left; //右子树 private BinaryTree right; } 各种遍历 前中后序遍历采用递归的方式,只是在输出的地方不同,其他地方一样,大家体会下为什么这样做。 广度优先,采用的是队列的方式,按层 先进先出。 package

【大话数据结构】二叉树的遍历(前序 中序 后续 层次 深度优先 广度优先 DFS BFS)

自古美人都是妖i 提交于 2019-12-03 04:30:39
书籍推荐 《大话数据结构》—— https://www.loneway.ren/book/detail/20006 二叉树的遍历 二叉树的遍历方式有两类:深度优先遍历和广度优先遍历。 深度优先遍历 深度优先遍历是指顺着某一条路径尽可能的向前探索,必要的时候(探索到叶子节点)回溯。 遍历顺序: 先根序遍历(DLR) 中根序遍历(LDR) 后根序遍历(LRD) 实现方法: 递归方法 给定一个二叉树,返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def inorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] """ assert isinstance

二叉树遍历(前序、中序、后序、层次、深度优先)递归和非递归 java实现

五迷三道 提交于 2019-12-03 04:30:20
二叉树是一种非常重要的数据结构,非常多其他数据结构都是基于二叉树的基础演变而来的。对于二叉树, 有深度遍历 和 广度遍历 ,深度遍历有 前序、中序以及后序 三种遍历方法,广度遍历即我们寻常所说的 层次遍历 。由于树的定义本身就是递归定义,因此採用递归的方法去实现树的三种遍历不仅easy理解并且代码非常简洁,而对于广度遍历来说,须要其他数据结构的支撑。比方堆了。 四种基本的遍历思想为: 前序遍历:根结点 —> 左子树 —> 右子树 中序遍历:左子树—> 根结点 —> 右子树 后序遍历:左子树 —> 右子树 —> 根结点 层次遍历:仅仅需按层次遍历就可以 比如。求以下二叉树的各种遍历 1 / \ 2 3 / \ / 4 5 6 / \ 7 8 前序遍历:1 2 4 5 7 8 3 6 中序遍历:4 2 7 5 8 1 6 3 后序遍历:4 7 8 5 2 6 3 1 层次遍历:1 2 3 4 5 6 7 8 二叉树的代码 public class TreeNode { public int val ; public TreeNode left , right ; public TreeNode ( int val ) { this . val = val ; this . left = this . right = null ; } } 一、前序遍历 1)依据上文提到的遍历思路:根结点

PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)

大城市里の小女人 提交于 2019-12-03 04:29:51
前言: 深度优先遍历 :对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历、中序遍历、后序遍历。具体说明如下: 前序遍历:根节点->左子树->右子树 中序遍历:左子树->根节点->右子树 后序遍历:左子树->右子树->根节点 广度优先遍历 :又叫层次遍历,从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。 例如对于一下这棵树: 深度优先遍历: 前序遍历:10 8 7 9 12 11 13 中序遍历:7 8 9 10 11 12 13 后序遍历:7 9 8 11 13 12 10 广度优先遍历: 层次遍历:10 8 12 7 9 11 13 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。 深度优先遍历: 1、前序遍历: /** * 前序遍历(递归方法) */ private function pre_order1( $root ) { if ( ! is_null( $root )) { //这里用到常量__FUNCTION__,获取当前函数名,好处是假如修改函数名的时候,里面的实现不用修改 $function = __FUNCTION__; echo $root -> key . "

二叉树遍历(前序、中序、后序、层次遍历、深度优先、广度优先)

有些话、适合烂在心里 提交于 2019-12-03 04:29:14
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有深度遍历和广度遍历,深度遍历有前序、中序以及后序三种遍历方法,广度遍历即我们平常所说的层次遍历。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁,而对于广度遍历来说,需要其他数据结构的支撑,比如堆了。所以,对于一段代码来说,可读性有时候要比代码本身的效率要重要的多。 四种主要的遍历思想为: 前序遍历:根结点 ---> 左子树 ---> 右子树 中序遍历: 左子树 ---> 根结点 ---> 右子树 后序遍历: 左子树 ---> 右子树 ---> 根结点 层次遍历:只需按层次遍历即可 例如,求下面二叉树的各种遍历 前序遍历:1 2 4 5 7 8 3 6 中序遍历:4 2 7 5 8 1 3 6 后序遍历:4 7 8 5 2 6 3 1 层次遍历:1 2 3 4 5 6 7 8 一、前序遍历 1)根据上文提到的遍历思路: 根结点 ---> 左子树 ---> 右子树,很容易写出递归版本: public void preOrderTraverse1(TreeNode root) { if (root != null) { System.out.print(root.val+" "); preOrderTraverse1(root.left);

二叉树

匿名 (未验证) 提交于 2019-12-03 00:40:02
1、树   树的常用术语 2、二叉树 3、查找节点 4、插入节点 5、遍历树 6、查找最大值和最小值 7、删除节点     ①、删除没有子节点的节点   ②、删除有一个子节点的节点   ③、删除有两个子节点的节点   ④、删除有必要吗? 8、二叉树的效率 9、用数组表示树 10、完整的BinaryTree代码 11、哈夫曼(Huffman)编码   ①、哈夫曼编码    ②、哈夫曼解码 12、总结   前面我们介绍数组的数据结构,我们知道对于有序数组,查找很快,并介绍可以通过二分法查找,但是想要在有序数组中插入一个数据项,就必须先找到插入数据项的位置,然后将所有插入位置后面的数据项全部向后移动一位,来给新数据腾出空间,平均来讲要移动N/2次,这是很费时的。同理,删除数据也是。   那么我们就希望一种数据结构能同时具备数组查找快的优点以及链表插入和删除快的优点,于是 树 诞生了。 回到顶部 1、树    树 ( tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限 节点 通过连接它们的 边 组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。      ①、节点:上图的圆圈,比如A,B,C等都是表示节点。节点一般代表一些实体,在java面向对象编程中,节点一般代表对象。   ②、边

剑指offer--重建二叉树

匿名 (未验证) 提交于 2019-12-03 00:37:01
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 必备知识点:前序遍历(根左右), 中序遍历(左根右),前序遍历第一个数1必是根节点,对应到中序遍历中根节点的位置,左边的数位于左子树,右边的数位于右子树;可以看出,1节点同时拥有左右子树;然后, 前序遍历中第二个数字2作为节点,对应到中序遍历中,左边为左子树,同时,右边没有数,所以2节点没有右子树。所以,可以通过递归实现二叉树重建。 TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin) { if (pre.empty() == NULL || vin.empty() == NULL) return NULL; size_t index = 0; for (; index < vin.size(); index++) { if (vin[index] == pre[0]) break; } TreeNode* root = new TreeNode(pre[0]); vector<int> pre_left, vin_left; vector<int> pre

代码题(6)― 二叉树的遍历

匿名 (未验证) 提交于 2019-12-03 00:33:02
1、144. 二叉树的前序遍历 (1)递归 /* * * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public : vector < int > res; vector < int > preorderTraversal(TreeNode* root) { if (root == nullptr) return res; res.push_back(root -> val); preorderTraversal(root -> left); preorderTraversal(root -> right); return res; } }; (2)非递归 /* * * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right

树-基本概念,遍历,表示法

匿名 (未验证) 提交于 2019-12-03 00:13:02
树的基本概念和常用术语 节点的度:一个结点的儿子结点个数称为该节点的度 树的度:一棵树的度是指该树中结点的最大度数。如上图的树的度是3 叶节点或终端节点:度为零的节点。如上图中E,I,J,C,G,H是叶节点 非终端节点或分支节点:度不为零的节点。除根节点外的分支节点都叫做内部节点。 路径:若存在树中的一个节点序列k1,k2,…,kj,使得结点ki是ki+1的父结点(1<=i<j),则称该结点序列是树中从结点k1到结点kj的一条路径。 路径长度:路径所经过的边的数目。 节点高度:从该结点到各叶结点的最长路径长度,例如上图中B,C,D的高度分别是2,0,1 树的高度: (这里规定单根的高度为0) 根结点的高度 结点的深度(或层数):从树根到任一结点n有唯一的路径,称该路径的长度为结点n的深度(或层数)。从根结点算起,根为第0层,它的孩子为第1层…… 森林:m(m>=0)棵互不相交的树的集合 树的遍历 前序遍历:先访问树根n,然后依次前序遍历T1,T2,…,Tk。 中序遍历:先中序遍历T1,然后访问树根n,接着依次对T2,T3,…,Tk 进行中序遍历。 后序遍历:先依次对T1,T2,…,Tk进行后序遍历,最后访问树根n。 树的表示方法 父节点数组表示法 (1)树中的结点数字化为它们的编号1,2,…,n。 (2)用一个一维数组存储每个结点的父结点。即:father[k