题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: //1. 深度遍历,按照从右边的子结点、该结点和左边的子结点依次加入栈中 // 这样就可以使得栈弹出的结点是从小到大这样的排列次序 //2. 从栈中依次弹出结点,该结点的左指针指向上一结点,右指针指向下一结点, // 然后构成双向链表 void dfs(TreeNode* root,stack<TreeNode* > &s) { if(root->right!=NULL) dfs(root->right,s); s.push(root); if(root->left!=NULL) { dfs(root->left,s); } } TreeNode* Convert(TreeNode* pRootOfTree) { //检查是否为空 if(pRootOfTree==NULL) return NULL; stack<TreeNode* > s; dfs(pRootOfTree,s); //生成一个临时的头结点 TreeNode *head = new TreeNode(-1); TreeNode *tmp = head; //从栈中依次弹出结点,该结点的左指针指向上一结点,右指针指向下一结点 while(!s.empty()) { TreeNode *t = s.top(); tmp->right = t; t->left = tmp; tmp = tmp->right; s.pop(); } //头结点向右移一个 head = head->right; //头结点的做指针指向NULL head->left = NULL; return head; } };