题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
题目分析
- 首先最容易想到的,是用一个数组来存储中序遍历的节点,然后再从头到尾,建立节点前后的连接关系
- 另外,二叉搜索树有一个特性,比自己大的放在右边,比自己小的放在左边
- 所以可以利用这一特性,遍历结点,转换子树,再连接上根节点
- 可以采用递归的方式,同时使用一个全局变量记录前面已经转换好的头结点
解法分析
- 递归,先处理右子结点,然后处理根节点,再处理左子结点,返回左子结点,即最小的结点
- 因为是递归,所以要采用全局变量来记录链表化后的头结点
代码
public class Solution {
// 全局变量,记录连接的头结点
TreeNode pre = null;
public TreeNode Convert(TreeNode root) {
if(root==null) return null;
// 转换右子树
Convert(root.right);
// 如果右子树不为空
if(pre!=null){
// 连接根节点
root.right = pre;
pre.left = root;
}
// root结点也加入到链表之中
pre = root;
// 转换左子树
Convert(root.left);
return pre;
}
}