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

 

题目描述

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

解题思路

 

问题是将二叉搜索树转换成一个排序的双向链表,考虑到二叉搜索树的中序遍历序列为排序序列,所以可用中序遍历的递归做法来调整指针。在遍历过程中,调整指针pLast使其指向当前已转换好双向链表的末尾也就是最大数字,这样每当遍历到一个节点,只需要调整两次指针:

  1. 调整当前结点的left指针指向pLast
  2. 调整pLast指向结点的right指针指向当前结点

这样递归调整完成后,pLast指向的就是双向链表的最后一个节点,要返回的是头结点,所以依次向前调整pLast直至其左指针为空即指向头结点。

 

代码

 

 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* pLast=NULL;
13     TreeNode* Convert(TreeNode* pRoot)
14     {
15         if(!pRoot)
16             return NULL;
17         ToList(pRoot);
18         while(pLast->left)
19             pLast=pLast->left;
20         return pLast;
21     }
22     void ToList(TreeNode* pRoot){
23         if(pRoot){
24             if(pRoot->left)
25                 ToList(pRoot->left);
26             if(pLast){
27                 pLast->right=pRoot;
28                 pRoot->left=pLast;
29             }
30             pLast=pRoot;
31             if(pRoot->right)
32                 ToList(pRoot->right);
33         }
34     }
35 };

 

posted @ 2018-04-14 10:43  FlyingWarrior  阅读(181)  评论(0编辑  收藏  举报