后序遍历

刷题笔记:二叉树的后序遍历序列(C++)

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-12 05:02:04
剑指offer刷题笔记 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 概念补充: 二叉搜索树的概念:它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。 后序遍历:左子树→右子树→根节点 思路: 根据后序遍历的概念,序列的最后一个数字便是根节点的数字。 根据二叉搜索树的概念,通过与根节点的数字比较可以找到左右结点分水岭 根据二叉搜索树的左右子树仍然是二叉搜索树,可以通过递归判断左右子树是否同时为二叉搜索树 源代码: class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { return bst(sequence,0,sequence.size()-1); } private: bool bst(vector<int> seq,int begin,int end){ if(seq.empty()||begin>end){ return false; } int root=seq[end]; //根结点 int i=0; /

L2-006 树的遍历

雨燕双飞 提交于 2020-01-11 23:39:17
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。 输出格式: 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: 4 1 6 3 5 7 2 #include<bits/stdc++.h> #define INF 0x3f3f3f3f typedef long long ll; using namespace std; const int maxn = 50; int n; typedef struct node { int data; node * lef; node * rig; }node,*tree; void build_tree(int *las,int *mid,int cnt,tree &tre) { if(cnt == 0) { tre = NULL; return; } tre = new node; tre->data = las[cnt - 1]; int i; for(i = 0;mid[i]!=las[cnt - 1];i++); build_tree

二叉树的中序遍历和后序遍历 (Ver. I)

核能气质少年 提交于 2020-01-11 19:40:13
题目描述 按中序遍历和后序遍历给出一棵二叉树,求这棵二叉树中叶子节点权值的最小值。 输入保证叶子节点的权值各不相同。 输入 测试数据有多组 对于每组测试数据,首先输入一个整数N (1 <= N <= 10000),代表二叉树有N个节点,接下来的一行输入这棵二叉树中序遍历的结果,最后一行输入这棵二叉树后序遍历的结果 输入一直处理到文件尾(EOF) 输出 对于每组测试数据,输出一个整数,代表二叉树中叶子节点权值最小值 样例输入 7 3 2 1 4 5 7 6 3 1 2 5 6 7 4 8 7 8 11 3 5 16 12 18 8 3 11 7 16 18 12 5 1 255 255 样例输出 1 3 255 提示 #include<iostream> using namespace std; class BitreeNode { public: int data; BitreeNode *left; BitreeNode *right; BitreeNode() { left=right=NULL; } }; class Bitree { public: BitreeNode *Root; int * inorder; int * pastorder; int len; int Min; Bitree(int n,int *i,int *p) { Min=99999;

数据结构基础温故-4.树与二叉树(上)

孤者浪人 提交于 2020-01-09 00:33:45
前面所讨论的线性表元素之间都是一对一的关系,今天我们所看到的结构各元素之间却是一对多的关系。树在计算机中有着广泛的应用,甚至在计算机的日常使用中,也可以看到树形结构的身影,如下图所示的Windows资源管理器和应用程序的菜单都属于树形结构。树形结构是一种典型的 非线性 结构,除了用于表示相邻关系外,还可以表示层次关系。本文重点讨论树与二叉树的基本结构和遍历算法等内容。 一、好大一棵树,绿色的祝福 1.1 树的基本概念 Defination: 树(Tree)是 n(n≥0)个结点的有限集。n=0时,该树被称为“空树”。如上图所示,A点称为根节点,它有两棵子树,分别以B、C为根,而以C为根的子树又可以分成两棵子树。   1.2 树的基本术语   (1)不同的节点:根节点、内部节点、叶子节点以及节点的 度    (2)节点的关系:双亲与孩子,爸爸回来了,爸爸去哪儿?   (3)节点的层次:结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。树中结点的最大层次称为树的 深度 (Depth)或 高度 。 二、二叉树又是个什么鬼 2.1 从猜数字游戏引出二叉树   回忆一下,当年某电视节目中会让游戏参与者猜一个产品的价格,如果参与者在限定时间内猜对了,那么他就可以获得这个产品。很多人都是一点点的提高数值来猜,但是这样猜会很没有效率。因此

树的知识点

纵然是瞬间 提交于 2020-01-08 12:09:30
树的基本概念、特点。 二叉树的定义、概念、特点。 二叉树的遍历顺序:前序DLR、中序LDR、后序LRD(递归与迭代);层序遍历(迭代) 树的操作:插入、删除、查询、遍历、旋转等 树、森林、二叉树的关系 树的应用:哈夫曼树、红黑树、AVL树、B(B+)树、Treap树、Trie树(字典树)、伸展树、替罪羊树等 来源: https://www.cnblogs.com/jest549/p/12165800.html

码农找工作之:秒杀算法面试必须掌握的14种模式

ぃ、小莉子 提交于 2020-01-07 20:38:40
对于茫茫多的程序员来说,准备算法面试简直就是一个亚历山大的过程。看不完的学习资料,更惨的是,很多内容和程序员干的事情感觉相去甚远,这无疑只会雪上加霜。 这样的结果之一就是:程序员需要花上数周的时间在诸如LeetCode这样的在线编程平台上准备刷上几百个面试题目。这些焦虑的程序员都关心类似的问题: 我刷了足够的题了吗?我应该再来点吗? 这就是为啥我专注于帮助码农们掌握每个问题背后的模式的原因:这样的话,你们就不需要苦逼哈哈地担心着茫茫多的(一千多道)LeetCode的进度条了,也帮助你们避免盲目刷题的疲劳。如果你理解这些通用的模式,你就可以把他们当做是模板,去解决其他类似的被改头换面过的题目了。 这篇文章就和大家唠唠所有的面试题目可能的14种模式。当然更重要的,我会给大家讲讲怎么去识别每种模式,每个模式再给大家来几个样题尝尝鲜。当然,这些只是冰山一角啦,详细的,不用多说,墙裂推荐你去看这门课: Grokking the Coding Interview: Patterns for Coding Questions 该课程提供详细的理论讲解,例子和编程训练。 如果你需要买该网址的任何课程,都可以使用coupon code: awesome-developer-20 拿到额外八折。 接下来的这些模式是建立在你已经知晓了数据结构的基础之上的。如果你还没掌握的话,嘿嘿,推荐你去看:

33、二叉搜索树的后序遍历

南楼画角 提交于 2020-01-06 18:26:03
1、题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 2、思路:二叉搜索树就是节点的左子树的值小于该节点的值,右子树的值大于该节点的值。所以对于二叉搜索树的后序列,左 右 根 的遍历顺序,数组的最后一个值一定是根节点,而根据二叉搜索树的性质,左子树的值小于根节点,右子树的值大于根节点,通过从前往后遍历数组,就可以初步找到左右子树的分界,分界之前一定是左子树,但是分界之后无法保证所有的值都大于根节点,因此要校验是否是右子树。校验完毕后,就在粗粒度上确定了符合二叉搜索树的条件,此时再分别将左右子树带入该方法进行迭代,在细粒度上确定整棵树是否完全符合二叉搜索树的性质。 3、代码: import java.util.*; import java.lang.*; public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { //鲁棒性校验 if(sequence==null||sequence.length==0){ return false; } int length=sequence.length; //数组最后一个数就是根节点的值 int root=sequence[length-1]; /

数据结构——二叉树的遍历

不羁岁月 提交于 2020-01-06 16:07:13
二叉树的先序遍历、中序遍历和后序遍历的递归算法,二叉树的非递归算法。 1、括号表示法创建二叉树 2、实现二叉树的递归遍历算法和非递归遍历算法(非递归算法选做),依次输出二叉树的先序、中序和后序遍历序列 3、二叉树的遍历遍历二叉树,输出结点值大于C的结点,而小于等于C的结点用*替代 4、遍历二叉树,输出结点值小于D的结点,而大于等于D的结点用*替代 main.cpp # include <malloc.h> # include <stdio.h> # include <iostream> using namespace std ; typedef char ElemType ; //Visit函数,对每个节点进行的访问 //需设置函数返回值类型 typedef void Status ; Status DispLargeThanC ( ElemType e ) //该函数输出树中大于C的字符 { if ( e > 'C' ) { printf ( "%2c" , e ) ; } else { printf ( "%2c" , '*' ) ; } } Status DispLessThanD ( ElemType e ) //该函数输出树中小于D的字符 { if ( e < 'D' ) { printf ( "%2c" , e ) ; } else { printf ( "%2c" ,

【洛谷1030】求先序遍历

白昼怎懂夜的黑 提交于 2020-01-03 10:40:15
原题: 给出一棵二叉树的中序与后序排列。求出它的先序排列。 性质: 1.三序遍历的序列中,同一子树的所有节点不留空隙地组成一个区间,即对于任意子树,存在一个区间使得区间内每个点都恰好是子树中的一个节点 2.中序遍历序列中,在一个子树的区间中,子树根节点左边的区间是左子树区间,右边的区间是右子树区间 3.后序遍历序列中,一个子树区间内,子树根节点左边是右子树区间,再左边是左子树区间 4.由上可以推出在某个字数区间中,后序遍历标号最大的节点是根节点 那么可以递归,参数为中序遍历序列中子树的区间端点,每次在子树区间中找到后序遍历标号最大的点,即子树根节点,然后递归处理左右子树区间 代码:(题目中不同节点用不同大写字母表示) 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int s[110000],t[110000],n,m; 5 int iod[110000],pstod[110000]; 6 void gtprod(int l,int r){ 7 if(l>r) return ; 8 int mx=0; 9 for(int i=l;i<=r;++i)if(pstod[s[i]]>pstod[s[mx]]) 10 mx=i; 11 printf("%c",s[mx]-1+'A'); 12 gtprod(l

145. 二叉树的后序遍历

醉酒当歌 提交于 2020-01-01 18:51:20
后序遍历 递归方法: /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List < Integer > postorderTraversal ( TreeNode root ) { List < Integer > rev = new ArrayList < Integer > ( ) ; postorder ( root , rev ) ; return rev ; } public void postorder ( TreeNode root , List < Integer > list ) { if ( root != null ) { postorder ( root . left , list ) ; postorder ( root . right , list ) ; list . add ( root . val ) ; } } } 非递归方法: (待续) 任务:总结先序,中序,后序的非递归方法 来源: CSDN 作者: Haha@25 链接: https:/