剑指offer之【二叉搜索树与双向链表】

题目:

  二叉搜索树与双向链表

链接: 

  https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目描述:

  输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

思路:

  对于一个二叉搜索树,当我们进行中序遍历的时候是按从小到大的顺序进行遍历。

  所以按照中序遍历的顺序,当我们遍历当前节点的时候,它的左子树已经转换成了一个排序的链表了,并且处在链表中的最后一个节点是当前值最大的节点,接着去遍历转换右子树。

代码:

  

 1 /*
 2 struct TreeNode {
 3     int val;
 4     struct TreeNode *left;
 5     struct TreeNode *right;
 6     TreeNode(int x) :
 7             val(x), left(NULL), right(NULL) {
 8     }
 9 };*/
10 class Solution{
11 public:
12     TreeNode* Convert(TreeNode* pRootOfTree)
13     {
14         TreeNode * leftLastNode = nullptr;
15         ConvertNode(pRootOfTree, &leftLastNode);
16         TreeNode *head = leftLastNode;
17         while(head != nullptr && head->left != nullptr){
18             head = head->left;
19         }
20         return head;
21     }
22     void ConvertNode(TreeNode *root ,TreeNode **leftLastNode){
23         if(root == nullptr)
24               return;
25         TreeNode *node = root;        //当前节点
26         if(node->left != nullptr){
27             ConvertNode(node->left,leftLastNode);
28         }
29         node->left = *leftLastNode;
30         if(*leftLastNode != nullptr){
31             (*leftLastNode)->right = node;
32         }
33         *leftLastNode = node;
34         if(node->right != nullptr){
35             ConvertNode(node->right,leftLastNode);
36         }
37     }
38 };
时间: 2024-10-22 19:20:05

剑指offer之【二叉搜索树与双向链表】的相关文章

剑指OFFER之二叉搜索树与双向链表(九度OJ1503)

题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数.接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替. 输出: 对应每个测试案例,输出将二叉搜索树转换成排序的双向链表后,从链表头至链表尾的遍历结果. 样例输入: 1 2 1 0 0 3 0 0 样例输出: 1 2 3 解题思路

剑指offer (27) 二叉搜索树和双向链表

题目:输入一棵BST,将该BST转换成一个排序的双向链表 要求不能创建新的结点,只能调整树中结点指针的指向 在BST中,左子节点的值 小于父节点的之, 父节点的值小于 右子节点的值 因此我们在转换成有序的双向链表时,原先指向左子节点的指针调整为链表中指向前一个结点的指针 原先指向右子节点的指针调整为链表中指向后一个结点的指针 很自然的想到对BST进行中序遍历 当我们遍历转换到根节点(值为10的结点)时,它的左子树已经转换成 一个排序的链表了,并且处在链表中的最后一个结点是当前值最大的结点 我们把

【剑指offer】二叉搜索树转双向链表

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26623795 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数.接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替. 输出: 对应每个测试案例,输出将二叉搜索树转换成

【剑指offer】二叉搜索树转双向链表,C++实现

原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.要求不能创建任何新的节点,只能调整树中节点指针的指向. 二叉树节点的定义 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NU

【Java】 剑指offer(36) 二叉搜索树与双向链表

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 二叉搜索树.排序链表,想到使用中序遍历. 要实现双向链表,必须知道当前结点的前一个结点.根据中序遍历可以知道,当遍历到根结点的时候,左子树已经转化成了一个排序的链表了,根结点的前一结点就是该链表的最后一个结点(这个结点必须记录下来,将遍历函数的返回值设置

剑指offer:二叉搜索树与双向链表

1.题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 2.解题思路: (1)将左子树构造成双向链表,并返回链表头节点: (2)定位左子树双链表的尾节点: (3)如果左子树链表不为空,将当前root连缀其链尾: (4)将右子树构造出双向链表,并返回链表头节点: (5)如果右子树链表不为空,将当前root连缀其表头: (6)根据左子树链表是否为空,确定返回的节点. 3.JavaScript实现: function Conv

剑指Offer之二叉搜索树与双向链表

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 基本思路 假设二叉搜索树为{10,6,14,4,8,12,16},按照中序遍历,当我们遍历转换到根节点(值为10的节点)时,它的左子树已经转换成一个排序的链表了,并且处在链表的最后一个节点是当前最大的节点.我们把值为8的节点和根节点链接起来,此时链表中的最后一个节点就是10了.接着我们去遍历转换右子树,并把根节点和右子树的最小的节点链接起来.转换左子树和右子树,使用递归的

【剑指Offer】二叉搜索树与双向链表

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 算法描述 使用递归,分别去将当前节点的左右子树变成双向链表,然后获取左边链表的最后一个元素,当前元素的左指针指向它,它的右指针指向当前元素:右边链表的第一个元素,它的左指针指向当前元素,当前元素的右指针指向它:然后从当前元素开始,不断从左边找,找到第一个元素,返回此元素的指针. 总结: 对这种涉及到二叉树的题目,可以使用测试驱动开始,先写测试用例,然后再编码. 代码实现

剑指offer 27二叉搜索树与双向链表

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

剑指Offer 26. 二叉搜索树与双向链表 (二叉搜索树)

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 题目地址 https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking