1.题目描述
给你一棵二叉搜索树,请 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
示例 1:
输入:root = [5,3,6,2,4,null,8,1,null,null,null,7,9]
输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
示例 2:
输入:root = [5,1,7]
输出:[1,null,5,null,7]
2.解题思路与代码
2.1 解题思路
简单题目就用最简单的方法解决,题目要展平二叉搜索树,并按照递增的顺序排列,那么我们可以根据二叉搜索树的中序遍历特性:中序遍历二叉搜索树得到的遍历结果是按照递增顺序排列的。那么根据这个特性我们直接中序遍历该二叉搜索树,并存入一个列表中,然后再遍历列表重新组装各个节点即可。重新组装的时候需要将每个节点的左树置为 null。
2.2 代码
class Solution {
public TreeNode increasingBST(TreeNode root) {
if (root == null) {
return null;
}
List<TreeNode> list = new ArrayList<>();
process(root,list);
root = list.get(0);
TreeNode curr = root;
for (int i = 1; i < list.size(); i++) {
curr.left = null;
curr.right = list.get(i);
curr = curr.right;
}
curr.left = null;
return root;
}
public void process(TreeNode root, List<TreeNode> list ) {
if (root == null) {
return;
}
process(root.left, list);
list.add(root);
process(root.right, list);
}
}
2.3 测试结果
通过测试
测试结果
3.总结
- 根据二叉搜索树的中序遍历特性解答
- 重组二叉树时需要将左子树置为null