二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
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 };