题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
一、递归的思路
对于函数TreeNode* Convert(TreeNode* root),传入的是需要转换的二叉树的头结点,返回的是已经转换好的双向链表的头结点。从root结点来看,以递归的思路就是将左孩子和右孩子做黑盒处理,left = Convert(root->left)返回的就是以左孩子为根节点的树已经转化好的双向链表的头结点,right = Convert(root->right)返回的就是以右孩子为根节点的树已经转化好的双向链表的头结点,只要left和right不为空,使用left找到左孩子双向链表的最后一个结点node,将node,root,right一连接,问题解决!
步骤:
1、根节点为root,递归root的左孩子,将左子树构成双向链表,并返回链表头结点left
2、使用left头结点遍历到左子树双链表的最后一个结点node
3、如果左子树链表不为空,将node和root连接起来
4、同理将右子树构成双向链表,并返回链表头结点right
5、如果右子树链表不为空,将root和right连接起来
6、如果left不为空,返回left,否则返回root
Paste_Image.png
public class Solution {
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;
}
}