html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; line-height: 1.6; color: ; background-color: ; margin: 0; padding: 16px 20px; } h1, h2, h…
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析: 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉排序树. 数组的最后一个元素是二叉搜索树的根结点的值,我…
剑指offer 牛客网 二叉搜索树和双向链表 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 18:58:36 2019 @author: Administrator 题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表. 要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路: step1:采用递归中序遍历的方式,将值放在列表中 step2:遍历将其转换成双向链表 """ c…
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同.   思路: 后续遍历数组的尾部为根节点,前面的部分,必然一部分为左子树,一部分为又子树,二叉搜索树,根节点左子树小于根节点的值,右子树大于. 所以我们只用遍历前面的部分,找到第一个大与根节点的,然后看后面是不是都是大于根节点的,如果是,size-1.   AC代码: class Solution { public: bool VerifySquen…
题目描述: 给定一颗二叉搜索树,请找出其中的第k大的结点. 例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4 分析: 二叉搜索树中序遍历就是从小到大.只要遍历k个结点就可以了. 代码: /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };…
题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 二叉搜索树,中序遍历就是排序的. 所以我们利用中序遍历,将前后两个结点连接在一起. 不过为了方便起见,我们可以用中序遍历的逆过程,最后遍历到最小的结点,并连接它,也可以输出为链表的首结点. 我们需要两个指针,记录一前一后的结点. 代码: /* struct TreeNode { int val; struct TreeNode *left; struct Tre…
①题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. ②思路 1.后续遍历的数组里,最后一个元素是根. 2.在BST里,左子树每个元素<根<右子树每个元素 3.从第0位开始,找到第一个>根节点的元素,记录此位置i.在此位置之前都属于左子树(此时已经断定左子树都小于根节点) 4.检查右子树是否都大于跟节点(从第i位开始,到根节点前) 5.递归判断左右子树是否都属于BST,也即重复3-4步: ③代码…
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 牛客网链接 js代码 /* function TreeNode(x) { this.val = x; this.left = null; this.right = null; } */ //方法一 let queue = [] function Convert(pRootOfTree) { // write code here if (!pRootOfTree) retu…
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 牛客网链接 js代码 function VerifySquenceOfBST(sequence) { // write code here if (sequence.length === 0) return false let length = sequence.length let root = sequence[length-1] let mi…
最后一个元素是 根节点. 左子树的元素都小于根节点,右子树都大于根节点 然后递归判断 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 class Solution { public:     bool VerifySquenceOfBST(vector<int> sequence) {         int size=sequ…
22[题目]输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径. * 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 * [思路]只要从根结点到叶结点一条一条遍历; * 如果到了叶结点,且此路径值跟目标值相同,就添加此路径: 不是,则从孩子子节点开始查找. [注]叶结点遍历完后要删除此叶结点值直至返回到父节点. package com.exe5.offer; import java.util.ArrayList; /** * 22[题目]输入一颗二叉树和一…
题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大的数组靠前)   解题思路 基本路线仍未进行二叉树遍历,只不过在路过一个节点时需要对该节点走过的路径长度进行统计. C++代码实现: /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNo…
/************************************************************************* > File Name: 25_BSTConvert.cpp > Author: Juntaran > Mail: JuntaranMail@gmail.com > Created Time: 2016年08月31日 星期三 15时06分28秒 *********************************************…
链接 https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题意 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 解题思路…
题目描述 给定一棵二叉搜索树,找出其中的第k小的结点,返回指向该节点的指针. 思路 中序遍历即可. 注意特判!报段错误数组越界这里就要考虑是少特判的问题. 法一:借助vector 法二(better)(学习的牛客网最佳解法):到第k个直接返回. 关键是理解: if (pNode != nullptr) { return pNode; } 有了这句话,当遍历到第k小的节点时,返回该节点指针,并会一路传出来.没有的话,则只是传给上层父节点,后续会被覆盖. 当未到第k个时,(node接收的)返回值一直…
正常情况下,因为二叉搜索树,左子树所有结点比根小,右子树所有结点比根大,所以循环一遍就能结束 ------------------------------------------------------------------------ 时间限制:1秒 空间限制:32768K 热度指数:356727 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. class Solution { public…
题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析: 二叉树的后序遍历也就是先访问左子树,再访问右子树,最后访问根节点,所以不难发现,所给的数组最后一个元素一定是二叉搜索树的根节点,而如果数组是二叉搜索树的后续遍历的话,就一定会根据数值划分两部分,左边是根节点的左子树,剩下的部分则是根节点的右子树.左子树的数值均小于根节点,右子树的数值均大于根节点. 例如{5,7,6,9,11,10,8},8是…
题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 创建两个指针,分别指向要处理的当前元素和当前元素的前一个元素.利用中序遍历找到二叉树中最小的元素,实际上也是双向链表的最左端的值.依次将当前元素和前一个元素用left和right连接起来,在处理右子树之前,要将前一个元素改成当前的元素,以便后续元素的处理.如图: 图出自:https://www.jianshu.com/p/7607d8519c59 当然还可以根据中序…
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 本身题目不是很难,但是因为刚接触pyhon,对一些对象的传递不太了解,所以跳了很久也没有通过,后来看到这篇文章  后才明白,犯了一样的错误 # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.ri…
自己写的更简洁的代码 class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { int length = sequence.size(); ) return false; ,length-); } bool VerifyCore(vector<int> sequence,int start,int end){ if(start >= end) 一定要有大于,大于可以比免没有左子树这种bug…
/* 题目: 输入一颗二叉树和一个整数,打印从根节点到叶子节点中所有和为该整数的路径. */ /* 思路: 先序遍历,深度遍历. 从树根开始,记录路径之和,遍历到叶子节点,如果和为期望值,则输出. 回退节点,寻找下一个叶子节点,直到遍历完所有到达叶子节点的路径. */ #include<iostream> #include<string.h> #include<algorithm> #include<cmath> #include<stdio.h>…
一.题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二.思路 对二叉搜索树中序遍历的结果即为排序的结果,在中序遍历的过程中,建立双向指针.详细过程见代码注释. 三.代码 public class Solution { TreeNode tempHead = null; // TreeNode realHead = null; //保存双向链表的头结点 public TreeNode Convert(TreeNode pRo…
一.题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 二.思路 1.二叉搜索树又称二叉排序树(Binary Sort Tree)或二叉查找树(Binary Search Tree).二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值: (3)左.右子树也分别…
剑指 Offer 03. 数组中重复的数字 题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次.请找出数组中任意一个重复的数字. Input: {2, 3, 1, 0, 2, 5} Output: 2 解题思路 要求时间复杂度 O(N),空间复杂度 O(1).因此不能使用排序的方法,也不能使用额外的标记数组. 对于这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到第…
leetcode是求当前所有数的二进制中1的个数,剑指offer上是求某一个数二进制中1的个数 https://www.cnblogs.com/grandyang/p/5294255.html 第三种方法,利用奇偶性找规律 class Solution { public: vector<int> countBits(int num) { vector<}; ;i <= num;i++){ == ) result.push_back(result[i/]); else result.…
说明: 1.本系列是根据<剑指Offer>这个系列做的一个小笔记. 2.直接动力是因为师兄师姐找工作很难,而且机械出生的我面试算法更难. 3.刚开始准备刷LeetCode.LintCode,突然看见一个大神研究生正在刷这个系列,故跟着大神学习. 4.在别人基础之上进行部分优化,总结自己的观点. 问题: 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 思路: 现在有这样一个问题 ,num=…
一.题目 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 二.思路 详见代码 三.代码 1.解答代码 import java.util.ArrayList; public class Solution { public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) { ArrayList<Array…
一.题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 二.思路 二叉树的层次遍历,可以借助队列实现.具体思路详见注释. 三.代码 import java.util.ArrayList; import java.util.LinkedList; /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val…
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路法一: * 矩阵是有序的,从左下角来看,向上数字递减,向右数字递增, * 因此从左下角开始查找,当要查找数字比左下角数字大时.右移 * 要查找数字比左下角数字小时,上移时间复杂度O(m+n)  法二:每行都用折半查找.时间复杂度是nlogn AC代码: class Solution { public: bool Fi…
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解题思路 该题有很多种解法,第一眼看过去,发现这个二维数组是有规律的,于是就排除了暴力解法. 每一行都是排好序了的,这又是个查找问题,于是我又想到了二分查找,这种解法的时间复杂度为O(nlogn);虽然可以过,但效率并不是很高. 还有一种解法,这个想法同样是由二分查找引起的. 二分查找是这样实现的 if(target <…