方法一: 首先按先序遍历二叉树,将遍历结果存放到数组中,然后再根据数组中的顺序依次生成一个只有右节点的二叉树。
class Solution {
List< Integer> list = new ArrayList < > ( ) ;
public void flatten ( TreeNode root) {
dfs ( root) ;
for ( Integer i : list) {
System. out. println ( i) ;
}
if ( list. size ( ) < 2 ) return ;
TreeNode head = new TreeNode ( list. get ( 1 ) ) ;
root. right = head;
root. left= null;
for ( int i= 2 ; i< list. size ( ) ; i++ ) {
TreeNode temp = new TreeNode ( list. get ( i) ) ;
head. right = temp;
head = head. right;
}
}
public void dfs ( TreeNode root) {
if ( root == null) return ;
list. add ( root. val) ;
dfs ( root. left) ;
dfs ( root. right) ;
}
}
后序遍历 通过后序遍历,递归地将某个节点的右子节点连接到左子节点的右边,再将这个左子树修改为右子树。
class Solution {
public void flatten ( TreeNode root) {
dfs ( root) ;
}
public void dfs ( TreeNode root) {
if ( root == null) return ;
dfs ( root. left) ;
dfs ( root. right) ;
if ( root. left!= null) {
TreeNode temp = root. left;
while ( temp. right != null) {
temp = temp. right;
}
temp. right = root. right;
root. right = root. left;
root. left = null;
}
}
}
改进的后序遍历 将后序遍历修改为先从右边开始,并使用一个pre节点保存当前根节点,这样每返回上一层递归时,将根节点的右指针指向pre节点,并将左节点置空。
class Solution {
TreeNode pre = null;
public void flatten ( TreeNode root) {
dfs ( root) ;
}
public void dfs ( TreeNode root) {
if ( root == null) return ;
dfs ( root. right) ;
dfs ( root. left) ;
root. left = null;
root. right = pre;
pre = root;
}
}