(将BST改成排序的双向链表.) 我的方法一:根据BST的性质,如果我们中序遍历BST,将会得到一个从小到大排序的序列.如果我们将包含这些数字的节点连接起来,就形成了一个链表,形成双向链表也很简单.关键是我们要知道我们在准备连接一个节点时,我们要知道它之前处理的那个节点,也就是小于它的最大一个节点.如果用迭代的方法,这个信息是丢失的,所以我们要用一个变量保存这个节点.下面是中序遍历的迭代方法,处理的过程变成了连接,处理完后更新lasthandle. public TreeNode build(T…
问题描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜索树转化为双向循环链表.链表中的每个节点都有一个前驱和后继指针.对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点. 下图展示了上面的二叉搜索树转化成的链表."head" 表示指向链表中有最小元素的节点. 特别地,我们希望可以就地完成转换操作.当转化完成以后,…
(判断一个元素均不相同的序列是否为一个BST的LRD) 书中方法:首先对于二叉搜索树,左子树中的所有元素小于根节点小于右子树中的所有元素,然后后序遍历序列最后一个元素是根节点,这是我们已知的条件.这道题不禁让人想起用一个普通二叉树的前序(或后序)遍历序列加上中序遍历序列就可以还原一棵二叉树,在那道题中,我们知道前序或后序序列就能开始组织根节点,但是因为我们无法确定子树的个数,所以还需要一个辅助的序列来确定子树范围.但如果改成BST的前序或后序遍历序列,我们就可以直接组织二叉树,BST的特性帮我们…
问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同.   参考以下这颗二叉搜索树: 5 / \ 2 6 / \ 1 3 示例 1: 输入: [1,6,3,2,5] 输出: false 示例 2: 输入: [1,3,2,6,5] 输出: true   提示: 数组长度 <= 1000 代码(递归) class Solution { public: bool verifyPostorder(ve…
问题描述 给定一棵二叉搜索树,请找出其中第k大的节点.   示例 1: 输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \   2 输出: 4 示例 2: 输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1 输出: 4   限制: 1 ≤ k ≤ 二叉搜索树元素个数 代码 这道题考察了二叉搜索树的性质,按照右->根->左的顺序搜索,得到的序列为从大到小,如果按照左->根-&g…
问题描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路: 将树分为三部分:左子树,根结点,右子树. 1.我们要把根结点与左子树的最大结点连接起来 2.要把根结点与右子树的最小结点连接起来. 代码:(本来按照书上的写的代码,可是得到的结果不对)(下面的代码是他人的代码) /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode righ…
题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树的定义如下: struct TreeNode{ int val; TreeNode* left; TreeNode* right; }; 思路: 在二叉树中,每个结点都有两个指向子结点的指针,在双向链表中,每个结点也有两个指针,他们分别指向前一个结点和后一个结点.两种数据结构看起来很相似,是可以通过某种方式将二叉搜索树转换为排序的双向链表. 在二叉搜索树中,当遍历到根…
题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路: 假设已经处理了一部分(转换了左子树),则得到一个有序的双向链表,现在则需要将根结点和链表的尾结点链接,然后再转换右子树. 这样分为三步: 1.转换左子树: 2.链接根节点.设置根节点的左指针.尾结点的右指针.更新尾结点. 3.转换右子树. 代码: /* struct TreeNode { int val; struct TreeNode *left; struct…
题目: 剑指offer的题目有挺多都挺典型的,就像这一道.不过书中的代码写的真是ugly,有很多题目LeetCode上都有,可以去LeetCode讨论区看看,经常有一些大神分享,写的代码真是高效.简洁.清晰,剑指offer上的代码不仅变量名定义又长又不知所云,让人看着就很不清晰明了,还有各种没必要的判断让代码看起来非常不直观. 思路:书中已经写的挺清楚了,通过中序遍历来做. package com.ss.offer; /** * 2018-09-15 下午11:18. * * @author b…
class Solution { public: void ConvertNode(TreeNode* pRootOfTree,TreeNode** pre) { if(pRootOfTree) { TreeNode* cur=pRootOfTree; if(cur->left) ConvertNode(cur->left,pre); cur->left=*pre; if(*pre) (*pre)->right=cur; *pre=cur; if(cur->right) Co…