将一棵二叉树按照前序遍历拆解成为一个假链表。所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针。
一刷ac
解题思路:可以用一个栈进行前序遍历,前序遍历过程中将left置为空,right置为栈顶元素。
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: a TreeNode, the root of the binary tree
* @return: nothing
*/
public void flatten(TreeNode root) {
if(root == null) return;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while(!stack.empty()){
TreeNode node = stack.pop();
if(node.right != null) stack.push(node.right);
if(node.left != null) stack.push(node.left);
if(stack.empty()){
node.left = null;
node.right = null;
}else{
node.left = null;
node.right = stack.peek();
}
}
}
}
也可以递归
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: a TreeNode, the root of the binary tree
* @return: nothing
*/
public TreeNode lastnode = null;
public void flatten(TreeNode root) {
if(root == null) return;
if(lastnode != null){
lastnode.left = null;
lastnode.right = root;
}
lastnode = root;
TreeNode right = root.right;
flatten(root.left);
flatten(right);
}
}