前序遍历

20182322 2019-2020-1 《数据结构与面向对象程序设计》第9周学习总结

点点圈 提交于 2019-12-05 00:08:29
教材第16章学习内容总结 本章的内容主要讲树,顾名思义树与队列、栈、列表最大的区别就在于,树是一种非线性结构,其元素是一种层次结构存放。 树: 用于描述树相关的术语有非常多,除了之前常用的结点(node)还有边(edge)、孩子、兄弟等等,其中我认为比较重要的有: 内部节点:非根节点,且至少有一个子结点 同胞节点:属于同一节点的子结点 叶节点:不包含任何子节点的结点 树的分类:可以有非常多的分类方式,但是最重要的标准是任一结点可以具有的最大孩子数目,成为度(order),n元树的定义也是由此定义的 树的数组实现:因为数组实现树比较麻烦,所以在树的数组实现中书上同样模拟了链接策略,如图所示。 树的遍历, 前序遍历:从根节点开始访问每一个节点及其孩子。如图: 中序遍历:从根节点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历根节点的右子树。如图: 后序遍历:从左到右先叶子后节点的方式遍历访问左右子树,最后访问根节点。如图: 层序遍历:从树的第一层,也就是根节点开始访问,从上到下逐层遍历,在同一层中,按从左到右的顺序结点逐个访问。如图: 二叉树 (二叉树极其重要,以至于用三级标题来写它,而不是一般的一个点。)二叉树又名二元树,它的每一个结点最多具有两个孩子结点。 二叉树 (二叉树极其重要,以至于用三级标题来写它,而不是一般的一个点。)二叉树又名二元树

Hive SQL 编译过程详解

﹥>﹥吖頭↗ 提交于 2019-12-04 17:22:46
Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用。美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析。Hive的稳定性和性能对我们的数据分析非常关键。 在几次升级Hive的过程中,我们遇到了一些大大小小的问题。通过向社区的咨询和自己的努力,在解决这些问题的同时我们对Hive将SQL编译为MapReduce的过程有了比较深入的理解。对这一过程的理解不仅帮助我们解决了一些Hive的bug,也有利于我们优化Hive SQL,提升我们对Hive的掌控力,同时有能力去定制一些需要的功能。 1、MapReduce实现基本SQL操作的原理 详细讲解SQL编译为MapReduce之前,我们先来看看MapReduce框架实现SQL基本操作的原理 1.1 Join的实现原理 select u.name, o.orderid from order o join user u on o.uid = u.uid; 在map的输出value中为不同表的数据打上tag标记,在reduce阶段根据tag判断数据来源。MapReduce的过程如下(这里只是说明最基本的Join的实现,还有其他的实现方式) 1.2 Group By的实现原理 select rank, isonline, count(*) from city group

C++ 二叉树的创建于遍历

旧城冷巷雨未停 提交于 2019-12-04 13:27:32
头文件(bitree.hpp) 1 #pragma 2 #include<iostream> 3 #include<queue> 4 #include<vector> 5 #include<stack> 6 using namespace std; 7 struct TreeNode 8 { 9 int NodeData; 10 TreeNode *pLeft; 11 TreeNode *pRight; 12 TreeNode(int x) :NodeData(x), pLeft(NULL),pRight(NULL) {} 13 }; 14 class Mytree 15 { 16 public: 17 void insertTree(TreeNode* proot,int n) 18 { 19 20 } 21 void PreOrderno(TreeNode *T)//前序遍历,递归 22 { 23 if (!T) 24 return; 25 if (T) 26 { 27 cout << T->NodeData << endl; 28 PreOrderno(T->pLeft); 29 PreOrderno(T->pRight); 30 31 } 32 33 } 34 void PreOrder(TreeNode *T)//非递归,前序遍历 35 { 36 if (T ==

用非递归的方法中序遍历二叉树

半世苍凉 提交于 2019-12-04 10:33:19
写这篇纯属个人兴趣了😂 要遍历二叉树的话优先推荐用递归的方法 在传统的遍历二叉树时,如果要使用递归的方法 前序遍历: void FrontOrder(biTree *s) {   if(s){     printf("%d",s->data);     FrontOrder(s->lchild);     FrontOrder(s->rchild);   } } 中序遍历: void InOrder(biTree *s) {   if(s){     InOrder(s->lchild);     printf("%d",s->data);     InOrder(s->rchild);   } } 后续遍历: void PostOrder(biTree *s) {   if(s){     PostOrder(s->lchild);     PostOrder(s->rchild);     printf("%d",s->data);   } } 用栈的话👇,话不多说,上代码 #include <stdio.h> #define maxsize 24 typedef struct node{ char data; struct node *lchild; struct node *rchild; }biTree; biTree * Q[maxsize]; biTree *

树和二叉树一篇就搞定!

[亡魂溺海] 提交于 2019-12-04 03:42:46
二叉树铺垫——树 前面几篇文章我们主要介绍的线性表,栈,队列,串,等等,都是一对一的 线性结构 ,而今天我们所讲解的 “树” 则是一种典型的 非线性结构 ,非线性结构的特点就是,任意一个结点的直接前驱,如果存在,则一定是唯一的,直接后继如果存在,则可以有多个,也可以理解为一对多的关系,下面我们就先来认识一下树 树的概念 下图我们日常生活中所见到的树,可以看到,从主树干出发,向上衍生出很多枝干,而每一根枝干,又衍生出一些枝丫,就这样组成了我们在地面上可以看到的树的结构,但对于每一个小枝丫来讲,归根结底,还是来自于主树干的层层衍生形成的。 我们往往需要在计算机中解决这样一些实际问题 例如: 用于保存和处理树状的数据,例如家谱,组织机构图 进行查找,以及一些大规模的数据索引方面 高效的对数据排序 先不提一些复杂的功能,就例如对于一些有树状层级结构的数据进行建模,解决实际问题,我们就可以利用 “树” 这种结构来进行表示,为了更符合我们的习惯,我们一般把 “树” 倒过来看,我们就可以将其归纳为下面这样的结构,这也就是我们数据结构中的 “ 树” 树中的常见术语 结点 :包含数据项以及指向其他结点的分支,例如上图中圆 A 中,既包含数据项 A 又指向 B 和 C 两个分支 特别的,因为 A 没有前驱,且有且只有一个,所以称其为根结点 子树 :由根结点以及根结点的所有后代导出的子图称为树的子树

leetcode 99:恢复二叉搜索树

一曲冷凌霜 提交于 2019-12-04 02:36:59
方法一:首先使用中序遍历将所有的节点和节点的值存起来,如果是搜索二叉树节点值的数组应该是升序的,找到不是升序的点,交换节点的值,空间复杂度为O(n) void inorder(TreeNode*root,std::vector<TreeNode*>&list,std::vector<int> &vals){ if(root==NULL) return; inorder(root->left,list,vals); list.push_back(root); vals.push_back(root->val); inorder(root->right,list,vals); } void recoverTree(TreeNode*root){ std::vector<TreeNode*>list; std::vector<int>vals; inorder(root,list,vals); std::vector<int> node; for(int i=0;i<vals.size()-1;){ if(vals[i]>vals[i+1]) { node.push_back(i); i=i+2; if(node.size()==2) break; }else i=i+1; } if(node.size()==1) { int c=node.back(); node.clear();

不一样的二叉树遍历(小学生都会)

百般思念 提交于 2019-12-04 01:46:46
二叉树遍历 二叉树的遍历分为三种,分别是前序遍历,中序遍历和后序遍历。(在这里,我会介绍两种方法) 前序遍历:先根后左子树最后右子树。 中序遍历:先左子树后根最后右子树。 后序遍历:先左子树后右子树最后根。 举个中序遍历例子 原图网址: https://img2018.cnblogs.com/blog/1706194/201910/1706194-20191006152149771-1726377171.png 其它的遍历可以以此类推。这是标准的二叉树遍历方法。 高端方法 刚才的做法很标准,也很好理解,但有些慢。下面的方法显然要省时,简单一些。 -----------------------------------------------------华丽的下划线-------------------------------------------------------- 还以这幅图为例 我们把这颗树以根节点为起点圈起来。 当这条线经过一个节点的前方时,则这个点为前序遍历的一个点。 当这条线经过一个节点的中间时,则这个点为中序遍历的一个点。 当这条线经过一个节点的后方时,则这个点为后序遍历的一个点。 还以中序遍历为例,经过点的顺序为BDCEHGKF。 高 端大气上档次, 我用这个方法压线过了初赛。 不要问我原理,我也不知道。 来源: https://www.cnblogs.com

第105题:从前序与中序遍历序列构造二叉树

拥有回忆 提交于 2019-12-04 00:46:23
一. 问题描述 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 二. 解题思路 本题思路:了解前序遍历和中序遍历的特点并利用递归算法进行求解。前序特点:第一个元素必定是根节点,而中序遍历的特点是,根节点左右必定是左右子树的节点的集合。 步骤一:构建递归函数(前序遍历数组:preorder,int num 根节点在前序遍历数组的index值,当前中序遍历的list,root,当前根节点) 步骤二:通过preorder[num]找到当前中序遍历list中的左右子树所有值,并将左子树集合放入leftlist中,右子树集合放入rightlist中。 步骤三:通过前序中序原理,找到左子树集合和右子树集合的当前根节点root.left和root.right。并将num值变成当前根节点值的index。重复步骤一重复递归函数(preorder,newleftnum,leftlist,root.left)和(preorder,newrightnum,rightlist,root.right) 步骤四:当list中只剩下根节点时,则返回,最后输出root。 三. 执行结果

数据结构学习--Java遍历二叉树

柔情痞子 提交于 2019-12-03 23:56:29
一、遍历树 遍历树是根据一个特定的顺序访问树的每一个节点,根据顺序的不同分为前序、中序、后序遍历三种。 二、前序遍历   1、访问根节点   2、前序遍历左子树   3、前序遍历右子树 三、中序遍历   1、中序遍历左子树   2、访问根节点   3、中序遍历右子树 四、后序遍历   1、后序遍历左子树   2、后序遍历右子树   3、访问根节点 代码实现 package com.example.deer;public class Tree { //根节点 public Node root; /** * 插入节点 * @param value */ public void insert(long value,String sValue){ //封装节点 Node newNode = new Node(value,sValue); //引用当前节点 Node current = root; //引用父节点 Node parent; //如果root为null,也就是第一次插入的时候 if(root == null){ root = newNode; return; }else{ while (true){ //父节点指向当前节点 parent = current; //如果当前指向的节点数据比插入的要大,则向左走 if(current.data > value){ current =

二叉树的存储结构以及遍历

依然范特西╮ 提交于 2019-12-03 23:45:35
一、二叉树的存储结构 ————顺序存储(一维数组)——— 1 #define MaxSize 100 //假设二叉树最大编号为99 2 typedef char DataType; //定义二叉树节点的数据类型,假设为char型 3 typedef struct{ 4 DataType data[MaxSize]; 5 int biTreeNum; //二叉树的节点个数 6 }SeqBiTree; ——————二叉链表———————— 1 typedef char DataType; 2 typedef struct BiNode{ 3 DataType data; 4 struct BiNode * lchild,* rchild; 5 }BiNode; 二、二叉树的遍历 遍历过程 转载自https://mp.weixin.qq.com/s/HXce4H21Gbu_O9ciXzJQYw ————深度优先遍历———— 1.前序遍历 2.中序遍历 3.后序遍历 ————广度优先遍历———— 4.层序遍历 总结:a.我们提到的四种遍历方式,其实都是在把树种的结点编程某种意义上的线性序列,这样给程序执行带来了好处。 b.前序、中序、后序遍历最根本的区别就是双亲结点的访问时机——前序是先访问双亲结点,然后左孩子,最后右孩子;中序是左孩子,双亲,右孩子;后序是左孩子、右孩子最后双亲结点。 c