虽然我不知道这样出题的意义所在,但是这个题目z真心的让人理解错误,这道题其实关键就是右子树移到左子树,然后,左子树再移到右子树上。我刚开始就理解错了,不过这道题的递归算法,我觉得很精妙。
题目如下:
给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
这个测试例子真的应该让人吐槽:
非递归:果然过了一段时间就会成长:2021年6月9号
暂时保存右子树,把左子树,放到右子树上;捋顺,再把原先的右子树,放到现在的右子树的末尾,再继续捋顺
public void flatten(TreeNode root) {
if(root==null){
return;
}
TreeNode p=root;
TreeNode t=root;
Deque<TreeNode> stack = new LinkedList<>();
while(p!=null || stack.size()>0){
if(p==null) {
p=stack.pop();
t.right=p;
}else{
t=p;
stack.push(p.right);
p.right=p.left;
p.left=null;
p=p.right;
}
}
}
我的解决办法:易理解,但是没有递归的好。
package test;
public class LC114Try2
{
public void flatten(TreeNode root)
{
getPass(root);
}
public TreeNode getPass(TreeNode root){
if(root==null){
return null;
}
TreeNode leftNode=root.left;
TreeNode rightNode=root.right;
TreeNode leftLastNode=getPass(root.left);
TreeNode rightLastNode=getPass(root.right);
if(leftNode!=null){
root.right=leftNode;
root.left=null;
if(rightNode!=null){
leftLastNode.right=rightNode;
return rightLastNode;
}
return leftLastNode;
}else{
if(rightNode!=null){
return rightLastNode;
}else{
return root;
}
}
}
}
人家递归的解决办法:
package test;
//真是用递归,用的熟练
public class LC114Try3
{
private TreeNode prev = null;
public void flatten(TreeNode root)
{
if (root == null)
return;
flatten(root.right);
flatten(root.left);
root.right = prev;
root.left = null;
prev = root;
}
}
哈哈