前序遍历

lintcode73. 前序遍历和中序遍历树构造二叉树

吃可爱长大的小学妹 提交于 2020-02-04 07:08:17
根据前序遍历和中序遍历树构造二叉树. 样例 样例 1 : 输入: [ ] , [ ] 输出: { } 解释: 二叉树为空 样例 2 : 输入: [ 2 , 1 , 3 ] , [ 1 , 2 , 3 ] 输出: { 2 , 1 , 3 } 解释: 二叉树如下 2 / \ 1 3 注意事项 你可以假设树中不存在相同数值的节点 /** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { public : /** *@param preorder : A list of integers that preorder traversal of a tree *@param inorder : A list of integers that inorder traversal of a tree *@return : Root of a tree */ TreeNode * buildTree ( vector < int > & preorder ,

前序遍历、中序遍历和后序遍历

半腔热情 提交于 2020-02-04 06:52:19
前序遍历: 前序遍历就像是从根节点出发的一个小人围着树跑了一圈 中序遍历 中序遍历就像是树画好之后在底下的投影 比如这个图,中序遍历的结果就是HDIBEJAFKCG 后序遍历: 后续遍历就像剪葡萄,将葡萄一颗颗的剪下来 比如这个图:HIDJEBKFGCA 来源: CSDN 作者: minastinis of king 链接: https://blog.csdn.net/qq_40971025/article/details/104152382

数据结构——二叉树(基础)

巧了我就是萌 提交于 2020-02-04 05:02:30
1、树存在意义: 1)数组的存储方式的分析 优点:通过下标方式访问元素,速度快,对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率低。 2)链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,连接到链表即可,删除效率也很好)。 缺点:在进行检索时,效率仍然很低,检索某个值,需要从头节点开始遍历。 3)树的存储方式分析 能提高存储,读取的效率,比如利用二叉排序树(Binary Sort Tree),既可以保证数据的检索速度,同事也可以保证数据的插入,删除,修改的速度 2、树的常用术语: 节点 :如A,B,F分别是树的节点; 根节点 :如A是整棵树的根节点; 父节点 :如B是E的父节点; 子节点 :如E是B的子节点; 叶子节点 :没有子节点的节点,如D.H,F,G都是叶子节点; 权 :若将树中节点赋给一个有着某种含义的数值,则这个数值称为该结点的权; 路径 :从root结点(根节点)找到该节点的路线,如H节点的路径为{A,B,E,H}; 层 :从根开始定义起,根为第一层,根的孩子为第二层。若某节点在第k层,则其子树的就在第k+1 层。如节点E的层数为3; 子树 :如集合{B,D,E,H}为A的一颗子树; 树的高度 :树的最大层数,如示例图树的高度为4; 森林 :是m (m>

数据结构 - 二叉树(删除节点)

点点圈 提交于 2020-02-03 06:53:43
因为二叉树是单向的,所以要判断当前节点的子节点(左或右)是否是被删除的节点 //递归删除节点 //规定:如果是叶子节点就删除节点,如果非叶子节点就删除子树 public void delNode ( int no ) { if ( this . left != null && this . left . no == no ) { this . left = null ; return ; } if ( this . right != null && this . right . no == no ) { this . right = null ; return ; } if ( this . left != null ) { this . left . delNode ( no ) ; } if ( this . right != null ) { this . right . delNode ( no ) ; } } //删除节点 public void delNode ( int no ) { if ( root != null ) { //判断root是不是要删除的节点 if ( root . getNo ( ) == no ) { root = null ; } else { root . delNode ( no ) ; } } } 完整代码 package tree ;

图的遍历

会有一股神秘感。 提交于 2020-02-03 04:38:14
图的遍历和树的遍历类似,希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫图的遍历。 对于图的遍历来说,如何避免因回路陷入死循环,就需要科学地设计遍历方案,通过有两种遍历次序方案:深度优先遍历和广度优先遍历。 1. 深度优先遍历 深度优先遍历,也有称为深度优先搜索,简称DFS。其实,就像是一棵树的前序遍历。 它从图中某个结点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中的所有顶点都被访问到为止。 我们用邻接矩阵的方式,则代码如下所示。 #define MAXVEX 100 //最大顶点数 typedef int Boolean; //Boolean 是布尔类型,其值是TRUE 或FALSE Boolean visited[MAXVEX]; //访问标志数组 #define TRUE 1 #define FALSE 0 //邻接矩阵的深度优先递归算法 void DFS(Graph g, int i) { int j; visited[i] = TRUE; printf("%c ", g.vexs[i]); //打印顶点,也可以其他操作 for(j = 0; j < g.numVertexes; j++)

数据结构——树

非 Y 不嫁゛ 提交于 2020-02-03 01:25:35
树 二叉树 特殊形态的二叉树:满二叉树、完全二叉树 二叉树的遍历 1):前序遍历 如果当前遍历的节点不为空 输出这个结点 进入它的左孩子 进入它的右孩子 2):中序遍历 如果当前遍历节点不为空 进入它的左孩子 输出这个节点 进入它的右孩子 3):后序遍历 如果当前遍历节点不为空 进入它的左孩子 进入它的右孩子 输出这个的结点 4):层序遍历 相关习题 1) Pre: ABCDEFGHIJ In: CDBEAGHFJI 2)In:DCBEGFAIJHLK Post: DCGFEBJILKHA 3):Pre:ABCDEF In: CBAEFD 此为临时文档,后续会补充完善。 来源: CSDN 作者: mango660 链接: https://blog.csdn.net/mango660/article/details/104147635

树(一)树的遍历

大兔子大兔子 提交于 2020-01-31 17:45:35
树的遍历 近期参加复旦互联网协会的刷题营,所以我勉勉强强又开始做题啦。现在变得更务实啦,要想提升能力,超过别人就是要依靠一项项的指标的胜利,这样的评价是更加客观的。想要提升能力,一方面要靠平时的积累,另外一方面也要依靠瓶颈期的奋力一搏。当然,我的意思是更加侧重前者的。话不多说啦,开始今天的话题——树的遍历。如果用递归的方法是非常简单,也是非常推荐的。但是,用迭代的方法也不难!!!所以我决定在这里探讨一下。 LeetCode题目 中序遍历 , 前序遍历 和 后序遍历 。当然,我知道有的朋友,就是喜欢野蛮自己的体魄,那你可以试一试, 从中序与后序遍历序列构造二叉树 , 从前序与中序遍历序列构造二叉树 以及 根据前序和后序遍历构造二叉树 。 保证你可以受到全身心的虐待。 各种遍历——递归实现 首先是TreeNode结构。 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 三种遍历的区别在于,什么时候访问root的值。下面是中序遍历,返回按序排序的值。 class Solution { List<Integer> list = new LinkedList<>(); public List<Integer> inorderTraversal

数据结构 递归遍历二叉树 C/C++

断了今生、忘了曾经 提交于 2020-01-31 06:38:47
#include<stdio.h> #include<stdlib.h> typedef struct btnode { char data; struct btnode *lchild,*rchild; }btnode,*bitree; bitree Creatbintree() //前序遍历创建二叉树 { char ch; bitree bt; scanf("%c",&ch); if(ch=='#') bt=NULL; else { bt=(btnode*)malloc(sizeof(btnode)); bt->data=ch; bt->lchild=Creatbintree(); bt->rchild=Creatbintree(); } return bt; } void Preorder(bitree bt) //前序遍历 { if(bt==NULL) return; printf("%c ",bt->data); Preorder(bt->lchild); Preorder(bt->rchild); } void Inorder(bitree bt) //中序遍历 { if(bt==NULL) return; Preorder(bt->lchild); printf("%c ",bt->data); Preorder(bt->rchild); } void

数据结构 非递归遍历二叉树

一世执手 提交于 2020-01-31 04:59:35
#include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct { bitree ptr; int flag; }stacknode; typedef struct { stacknode elm[MAX]; int top; }sqstack; typedef struct btnode { char data; struct btnode *lchild,*rchild; }btnode,*bitree; bitree Creatbintree() //前序遍历创建二叉树 { char ch; bitree bt; scanf("%c",&ch); if(ch=='#') bt=NULL; else { bt=(btnode*)malloc(sizeof(btnode)); bt->data=ch; bt->lchild=Creatbintree(); bt->rchild=Creatbintree(); } return bt; } typedef struct { bitree data[MAX]; int top; }seqstack; seqstack *Init_seqstack() { seqstack *s; s=malloc(sizeof(seqstack)); if(s) s->top=

树与二叉树

戏子无情 提交于 2020-01-30 11:11:20
树 有许多逻辑关系并不是简单的线性关系,在实际场景中,常常存在着一对多,甚至是多对多的情况。其中树和图就是典型的非线性数据结构,我们首先讲一讲树的知识。 什么是树呢?在现实生活中有很多体现树的逻辑的例子。例如你家的“家谱”,就是一个“树”。再如企业里的职级关系,也是一个“树”。 除人与人之间的关系之外,许多抽象的东西也可以成为一个“树”,如一本书的目录。 以上这些例子有什么共同点呢?为什么可以称它们为“树”呢?因为它们都像自然界中的树一样,从同一个“根”衍生出许多“枝干”,再从每一个“枝干”衍生出许多更小的“枝干”,最后衍生出更多的“叶子”。 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个节点有零个或多个子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节点外,每个子节点可以分为多个不相交的子树; 下面这张图,就是一个标准的树结构。 在上图中,节点1是根节点(root);节点5、6、7、8是树的末端,没有“孩子”,被称为叶子节点(leaf)。图中的虚线部分,是根节点1的其中一个子树。 同时,树的结构从根节点到叶子节点