解题思路:中序遍历即可,一直往左找,直至左孩子为空,这个节点就是要返回的链表头节点,pre不为空的时候就让pre.rihgt=当前节点,当前节点.left=pre即可,时间复杂度O(N),空间复杂度O(1)
这里说明一下:最终若返回 pre,那么是降序排列,题干要求升序,故保存第一个节点,返回root节点即可
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
TreeNode root = null;
TreeNode pre = null;
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) {
return null;
}
//从小到大->二叉搜索树的中序遍历
Convert(pRootOfTree.left);
if (root == null) {
root = pRootOfTree;
}
if (pre != null) {
pre.right = pRootOfTree;
pRootOfTree.left = pre;
}
pre = pRootOfTree;
Convert(pRootOfTree.right);
//返回头节点
return root;
}
}
解法二: 也可以用非递归的方法,不过需要栈将节点给保存起来,时间复杂度O(N),空间复杂度O(N)
import java.util.*;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) {
return null;
}
Stack<TreeNode> stack = new Stack<>();
while (pRootOfTree != null) {
stack.push(pRootOfTree);
pRootOfTree = pRootOfTree.left;
}
//要返回的头节点
TreeNode root = stack.pop();
TreeNode pre = root;
TreeNode cur = root.right;
while (!stack.isEmpty() || cur != null) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
cur.left = pre;
pre.right = cur;
pre = cur;
cur = cur.right;
}
//返回头节点
return root;
}
}