LeetCode.897.Increasing Order Search Tree BST转升序单边树
题目描述
897 Increasing Order Search Tree
https://leetcode-cn.com/problems/increasing-order-search-tree/
Given a binary search tree, rearrange the tree in in-order so that the leftmost node in the tree is now the root of the tree, and every node has no left child and only 1 right child.
Example 1:
Input: [5,3,6,2,4,null,8,1,null,null,null,7,9]
5
/ \
3 6
/ \ \
2 4 8
/ / \
1 7 9
Output: [1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
1
\
2
\
3
\
4
\
5
\
6
\
7
\
8
\
9
Note:
The number of nodes in the given tree will be between 1 and 100.
Each node will have a unique integer value from 0 to 1000.
解题过程
我用了一种 InPlace 就地组装的方法
递归函数 postOrder() 返回root转换成的单边树的跟
对于 root ,分别对其左右子树调用 postOrder() ,然后把 root 接到 left 的最右叶子上,把 right 接到 root 的右子树上即可。
时间复杂度 O(n)
,空间复杂度 O(n)
private static class SolutionV2020 {
public TreeNode increasingBST(TreeNode root) {
if (null == root) {
return null;
}
return postOrder(root);
}
// 返回root转换成的单边树的跟
private TreeNode postOrder(TreeNode root) {
if (null == root) {
return null;
}
TreeNode left = postOrder(root.left);
root.right = postOrder(root.right);
// 注意一定要把left置为null,要不就乱了
root.left = null;
if (null != left) {
// 返回的left是左子树转换成的单边树的跟,沿着根向右走到最右叶子
TreeNode newRoot = left;
while (null != left.right) {
left = left.right;
}
left.right = root;
return newRoot;
} else {
return root;
}
}
}
GitHub代码
algorithms/leetcode/leetcode/_897_IncreasingOrderSearchTree.java
https://github.com/masikkk/algorithms/blob/master/leetcode/leetcode/_897_IncreasingOrderSearchTree.java
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: