二叉搜索树转换为双向链表

来源:互联网 发布:sql case when 多行 编辑:程序博客网 时间:2024/05/21 09:14

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


思路:

方法一:非递归版
解题思路:
1.核心是中序遍历的非递归算法。
2.修改当前遍历节点与前一遍历节点的指针指向。
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}};class Solution {public:TreeNode* Convert(TreeNode* pRootOfTree){if(pRootOfTree==NULL)return NULL;stack<TreeNode*> sta;TreeNode* p = pRootOfTree;TreeNode* pre = NULL,*root;// pre用于保存中序遍历序列的上一节点bool isFirst = true;while(p!=NULL||!sta.empty()){while(p!=NULL){sta.push(p);p = p->left;}p = sta.top();sta.pop();if(isFirst){root = p;// 将中序遍历序列中的第一个节点记为rootpre = root;isFirst = false;}else{pre->right = p;p->left = pre;pre = p;}       p = p->right;}return root;}};
方法二:递归版
解题思路:
1.将左子树构造成双链表,并返回链表头节点。
2.定位至左子树双链表最后一个节点。
3.如果左子树链表不为空的话,将当前root追加到左子树链表。
4.将右子树构造成双链表,并返回链表头节点。
5.如果右子树链表不为空的话,将该链表追加到root节点之后。
6.根据左子树链表是否为空确定返回的节点。
public TreeNode Convert(TreeNode root) {if(root==null)return null;if(root.left==null&&root.right==null)return root;// 1.将左子树构造成双链表,并返回链表头节点TreeNode left = Convert(root.left);TreeNode p = left;// 2.定位至左子树双链表最后一个节点while(p!=null&&p.right!=null){p = p.right;}// 3.如果左子树链表不为空的话,将当前root追加到左子树链表if(left!=null){p.right = root;root.left = p;}// 4.将右子树构造成双链表,并返回链表头节点TreeNode right = Convert(root.right);// 5.如果右子树链表不为空的话,将该链表追加到root节点之后if(right!=null){right.left = root;root.right = right;}return left!=null?left:root;        }