胡扯:之前吐槽的 leetcode 使用全局变量的问题,应该是我操作的问题。java还是可以使用全局变量的,只要 别在全局变量前面加上 static 就好了。从本题开始,坚持每道题都写一篇简短的文章。
原题位置 :https://leetcode-cn.com/problems/increasing-order-search-tree/
思路:
1、首先把树进行 中序遍历,可以使用 ArrayList 按照中序的顺序存起来。 关于三种遍历查看 三种遍历
2、然后再去循环数组把一个个结点拼接起来。
3、我最开始没有用 集合,用的是 String 把每一个数字拼接起来,这样后期有个问题就是字符变成数字设计ascii 的问题。其实除了这个还有一个重要的问题,就是如果数字是 222,它会分成三个字符,这明显就错了. 所以使用集合是最好的。
4、在 刷题的时候, 第一步总是来个 非空 判断。
代码一 (击败百分之 20的人)
class Solution {
List<Integer> list = new ArrayList<>();
void dfs (TreeNode root){
if( root.left != null)
dfs(root.left);
list.add(root.val);
if( root.right != null )
dfs( root.right );
return ;
}
public TreeNode increasingBST(TreeNode root) {
if(root == null)
return root;
dfs(root);
TreeNode head = new TreeNode( list.get(0) );
list.remove(0);
TreeNode head1 = head;
for(Integer i : list){
head.left = null;
TreeNode tem = new TreeNode(i);
head.right = tem;
head = tem;
}
return head1;
}
}
代码二(思路和上面的基本一样,简单的优化了一下,打败了 百分之70的人)
class Solution {
TreeNode head = new TreeNode(-1);
TreeNode head1 = head;
void dfs (TreeNode root){
if( root.left != null)
dfs(root.left);
head.left = null;
TreeNode tem = new TreeNode(root.val);
head.right = tem;
head = tem;
if( root.right != null )
dfs( root.right );
return ;
}
public TreeNode increasingBST(TreeNode root) {
if(root == null)
return root;
dfs(root);
return head1.right;
}
}