二叉搜索树与双向链表

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

 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 
11 /*
12 //递归版本1
13     TreeNode* Convert(TreeNode* pRootOfTree)
14     {
15         if(!pRootOfTree) return NULL;
16         if(!pRootOfTree->left&&!pRootOfTree->right) return pRootOfTree;
17          TreeNode* left;
18         left=Convert(pRootOfTree->left);
19         TreeNode* p=left;
20         //找到左子树转换成双链表之后最后一个元素。
21         while(p!=NULL&&p->right!=NULL)
22             p=p->right;
23         if(left)
24         {
25             p->right=pRootOfTree;
26             pRootOfTree->left=p;
27         }
28         //右子树第一个接到root之后。
29         TreeNode* right;
30         right=Convert(pRootOfTree->right);
31         if(right)
32         {
33             right->left=pRootOfTree;
34             pRootOfTree->right=right;
35         }
36         return  left!=NULL?left:pRootOfTree;
37     }
38 */
39 class Solution {
40 public:
41     //递归版本2
42     TreeNode* pre;//全局变量,保存当前访问结点的前一个结点
43     TreeNode* Convert(TreeNode* pRootOfTree)
44     {
45         if(pRootOfTree==NULL) return NULL;
46         if(!pRootOfTree->left&&!pRootOfTree->right)
47         {
48             pre=pRootOfTree;
49             return pRootOfTree;
50         }
51         TreeNode* left=Convert(pRootOfTree->left);
52         //前一个结点的右子树指向当前节点,当前节点的左子树指向前一个节点,即可实现双向链表。
53         if(left)
54         {
55             pre->right=pRootOfTree;
56             pRootOfTree->left=pre;
57         }
58         pre=pRootOfTree;
59         TreeNode* right=Convert(pRootOfTree->right);
60         if(right)
61         {
62             right->left=pRootOfTree;
63             pRootOfTree->right=right;
64         }
65         return left!=NULL?left:pRootOfTree;
66      }
67 };

 

posted on 2017-11-17 15:17  wsw_seu  阅读(147)  评论(0编辑  收藏  举报

导航