题目: 给一个树,请你 按中序遍历 重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。
示例:
输入:
输出:
思路分析:
一、大思路就是先中序遍历获得一个升序列表,然后将所获列表转换成题目所要求形式的二叉树。
二、在主函数中通过循环得到一棵树,具体解析在代码中。
算法复杂度分析:
1.时间复杂度O(N):需要遍历树的所有结点且只遍历一次。
2.空间复杂度O(N):递归调用栈辅助空间。
Code
class Solution {
List<Integer> list = new LinkedList<>();
public TreeNode increasingBST(TreeNode root) {
helper(root);
TreeNode node = null;
int size = list.size();
if (size > 0) {
for (int i = size - 1; i >= 0; i--) { //这一步可以尝试使用顺序进行完成,详情见下
TreeNode temp = new TreeNode(list.get(i));
temp.left = null;
temp.right = node;
node = temp;
}
}
return node;
}
public void helper(TreeNode root) {
if (root == null) {
return;
}
helper(root.left);
list.add(root.val);
helper(root.right);
}
}
主函数中的循环可以使用顺序:
public TreeNode increasingBST(TreeNode root) {
helper(root);
TreeNode node = new TreeNode(0), cur = node;
int size = list.size();
if (size > 0) {
for (int i = 0; i < size; i++) {
cur.right = new TreeNode(list.get(i));
cur = cur.right;
}
}
return node.right;
}
循环还有更简便的处理方式:
public TreeNode increasingBST(TreeNode root) {
helper(root);
TreeNode node = new TreeNode(0), cur = node;
for (int v : list) {
cur.right = new TreeNode(v);
cur = cur.right;
}
return node.right;
}
PS: 学会完成树的创建,一定要形成结点与结点之间的连接,否则输出就不会是完整的一棵树,吸取本题经验。