【剑指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(NULL) {
  8 	}
  9 };*/
  • 二叉搜索树转双向链表的例子

# 思路

  • 二叉搜索树的性质
    • 二叉搜索树是左子树<根节点<右子树
    • 二叉搜索树的中序遍历是递增的有序序列
  • 二叉搜索树转双向链表的思路
    • 二叉搜索树的根节点的左指针指向左子树的最大节点,根节点的右子树指向右子树的最小节点。

# 代码

  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 struct TreeNode {
 15 	int val;
 16 	struct TreeNode *left;
 17 	struct TreeNode *right;
 18 	TreeNode(int x) :
 19 			val(x), left(NULL), right(NULL) {
 20 	}
 21 };*/
 22 class Solution {
 23 public:
 24     TreeNode* Convert(TreeNode* pRootOfTree)
 25     {
 26         // 双向链表尾节点
 27         TreeNode* list_last = nullptr;
 28
 29         // 递归转换
 30         ConvertNode(pRootOfTree,list_last);
 31
 32         // 双向链表首节点
 33         while(list_last->left != nullptr) // 边界条件
 34         {
 35             list_last = list_last->left;
 36         }
 37
 38         // 返回双向链表的首节点
 39         return list_last;
 40     }
 41
 42     void ConvertNode(TreeNode* cur,TreeNode* list_last)
 43     {
 44         // 边界条件
 45         if(cur==nullptr) return ;
 46
 47         // 遍历左子树
 48         if(cur->left != nullptr) ConvertNode(cur->left,list_last);
 49
 50         // 实现双向链接(建立连接)
 51         cur->left = list_last;
 52         if(list_last != nullptr) list_last->right = cur;
 53         list_last = cur;
 54
 55         //遍历右子树
 56         if(cur->right != nullptr) ConvertNode(cur->right,list_last);
 57     }
 58 };
 59         if (pRootOfTree == NULL)return NULL;
 60
 61         TreeNode *pointer = NULL;
 62
 63         convert2List(pRootOfTree, pointer);
 64
 65         while (pointer->left!=NULL)
 66         {
 67             pointer = pointer->left;
 68         }
 69         return pointer;
 70     }
 71     void convert2List(TreeNode* pRoot,TreeNode *&pointer)
 72     {
 73         if (pRoot == NULL)
 74         {
 75             return;
 76         }
 77         {
 78             if (pRoot->left != NULL)
 79             {
 80                 convert2List(pRoot->left,pointer);
 81             }
 82
 83             pRoot->left = pointer;
 84             if (pointer != NULL)
 85             {
 86                 pointer->right = pRoot;
 87             }
 88
 89             pointer = pRoot;
 90             if (pRoot->right!=NULL)
 91             {
 92                 convert2List(pRoot->right, pointer);
 93             }
 94         }
 95     }
 96 };

原文地址:https://www.cnblogs.com/wanglei5205/p/8780086.html

时间: 2024-10-26 01:38:48

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

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

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路:迭代版本: 核心思想是中序遍历,头结点需要单独设置flag变量进行初始化. if(!s.empty()){ if(flag == 1){ head = s.top(); cur = s.top(); s.pop(); cur -> left = pre; pre -> right = cur; pre = pre -> right; flag = 0; }

剑指OFFER 二叉搜索树的后序遍历

剑指OFFER 二叉搜索树的后序遍历 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析 判断是否是二叉搜索树的后序遍历结果,那么得先明白什么是二叉搜索树,还有什么是后序遍历 这是一颗二叉搜索树,其每个节点都满足 左孩子<父母<右孩子 其后序遍历为 4 7 5 10 12 11 9 [ 小][ 大 ][中] 然后小部分/大部分内部也同样满足这样的规律,那么,用递归是最方便的 代码 class

剑指offer——二叉搜索树的后序遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出true,否则输出false.假设输入的数组的任意两个数字都不相同. 思路:首先二叉搜索树是指左子树全部小于根节点,右子树全部大于根节点的树.故: 对于一棵树:首先找到右子树的第一个节点,然后判断右子树中是否有小于根节点的节点,若有,则输出false. 1 public class Solution { 2 public boolean VerifySquenceOfBST(int [] sequence) { 3

二叉搜索树与双向链表的转换

题目:输入一棵二叉搜索树(记住是搜索树),将该二叉搜索树转换为一个排序的双向链表.要求:不能创建任何新的结点,只能调整树中结点指针的指向. 分析:如下图 因为是二叉搜索树.所以树的排列是规则的.通过中序遍历正好遍历的是由小到大的序列. 要求说明是只能改变树结点指针的指向,不能增加新的空间和结点.所以在中序遍历的时候,主要是遍历到结点后就去改变指针指向. 为了简单,采用递归进行遍历. 树的结构 struct BinaryTreeNode{ int m_data; BinaryTreeNode* m

剑指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

二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 按中序遍历二叉搜索树可从小到大遍历元素 边遍历元素边创建双向链表 最后得到的双向链表的指针指向最后一个节点,所以需要再往回遍历一遍让指针指到头结点 代码 /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public Tre

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

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