【剑指offer】24.二叉搜索树与双向链表
总目录:
1.问题描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示
 
 数据范围:输入二叉树的节点数 0≤n≤1000,二叉树中每个节点的值 0≤val≤1000
要求:空间复杂度O(1)即在原树上操作),时间复杂度 O(n)
要求:空间复杂度O(1)即在原树上操作),时间复杂度 O(n)
  注意: 
  1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构
  4.你不用输出双向链表,程序会根据你的返回值自动打印输出  
2.问题分析
1递归,左右分别递归,然后按规则将root节点与左侧的最后一个节点互相绑定,将root与右侧的第一个节点互相绑定
3.代码实例
递归
 
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 if (!pRootOfTree) { 14 return NULL; 15 } 16 17 //叶子节点 18 if (pRootOfTree->left == NULL && pRootOfTree->right == NULL) { 19 return pRootOfTree; 20 } 21 22 //向左绑定 23 TreeNode* leftHead = Convert(pRootOfTree->left); 24 if (leftHead) { 25 while (leftHead->right) { 26 leftHead = leftHead->right; 27 } 28 leftHead->right = pRootOfTree; 29 } 30 pRootOfTree->left = leftHead; 31 32 //向右绑定 33 TreeNode* rightHead = Convert(pRootOfTree->right); 34 if (rightHead) { 35 rightHead->left = pRootOfTree; 36 } 37 pRootOfTree->right = rightHead; 38 39 40 //从双向链表中找到首节点 41 TreeNode* head = pRootOfTree; 42 while (head->left) { 43 head = head->left; 44 } 45 return head; 46 } 47 };
 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号