897. 递增顺序搜索树
难度:简单
语言:Java
题目描述
给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
思路解答
简单题不需要说太多思路,树的题目无外乎两种解决方法,递归与迭代。
先回顾一下树的递归三种遍历方式:
先序遍历
遍历方式为根左右
void dfs(TreeNode root) {
if (root == null) return ;
list.add(root); //操作流程写在这里
dfs(root.left);
dfs(root.right);
中序遍历
对于搜索树来说,中序遍历的是有序的,遍历方式为左根右
void dfs(TreeNode root) {
if (root == null) return ;
dfs(root.left);
list.add(root); //操作流程写在这里
dfs(root.right);
后序遍历
遍历方式为左右根
void dfs(TreeNode root) {
if (root == null) return ;
dfs(root.left);
dfs(root.right);
list.add(root); //操作流程写在这里
那回到这一题的题目,首先我们肯定是将所有的内容都找出来放进list,再进行树的构建
class Solution {
ArrayList<TreeNode> list = new ArrayList<>(); //创建list存储中序遍历数据
void dfs(TreeNode root){
if (root == null) return;
dfs(root.left);
list.add(root);
dfs(root.right);
}
public TreeNode increasingBST(TreeNode root) {
dfs(root); //更新List
TreeNode ans = new TreeNode(-1);
TreeNode cur = ans;
for (TreeNode i : list){
cur.right = i;
i.left = null;
cur = i;
}
return ans.right;
}
}
递归的方法简单明了,简单题就多看一下迭代的方法,
迭代的办法就是利用栈的特性来进行储存,就举中序遍历为例
class Solution {
List<TreeNode> list = new ArrayList<>();
public TreeNode increasingBST(TreeNode root) {
Deque<TreeNode> d = new ArrayDeque<>();
while (root != null || !d.isEmpty()) {
while (root != null) {
d.add(root); //压栈
root = root.left;
}
root = d.pollLast(); //出栈
list.add(root); //储存
root = root.right;
}
TreeNode dummy = new TreeNode(-1);
TreeNode cur = dummy;
for (TreeNode node : list) {
cur.right = node;
node.left = null;
cur = node;
}
return dummy.right;
}
}