avatar
关于leetcode上的一道题# JobHunting - 待字闺中
e*i
1
Hi leetcode上我有道题看不明白,求教各位大神。
是关于flatten binary tree to linkedlist那道。
我看到一个答案。
public class Solution {
03 public void flatten(TreeNode root) {
04 if(root==null)
05 return;
06
07 TreeNode curr=null;
08 Stack trees=new Stack();
09 trees.add(root);
10 while(!trees.empty())
11 {
12 TreeNode parent=trees.pop();
13
14 if(parent.right!=null)
15 {
16 trees.push(parent.right);
17 }
18
19 if(parent.left!=null)
20 {
21 trees.push(parent.left);
22 }
23 parent.left=null;
24 parent.right=null;
25 if(root==parent)
26 {
27 curr=parent;
28 }
29 else
30 {
31 curr.right=parent;
32 curr=curr.right;
33 }
34 }
35
36 }
37 }
这个答案是能通过测试的。
可是我看不懂的地方是除了在12行,将stack里的root节点赋值给parent意外,自始至
终root节点都没有改变过。为什么root就被flatten了呢?
我太水了,真心看不懂
avatar
c*a
2
while()前半是preorder-traverse
后半段这里就是连接部份
31 curr.right=parent;
32 curr=curr.right;
你把名字parent改为curr, curr改为prev这样的容易明白了
avatar
l*b
3
贴个我写的。。。
void flatten2(TreeNode *r) { // In place way
while(r) {
if(r->right == NULL) {
r->right = r->left;
r->left = NULL; // leetcode require this
} else if(r->left != NULL) {
TreeNode *t = r->left;
while(t->right)
t = t->right;
t->right = r->right;
r->right = r->left;
r->left = NULL; // leetcode require this
}
r = r->right;
}
}
avatar
c*t
4
root没有变,parent和curr在变,把所有节点都flatten到root->right了。
唯一我觉得奇怪的是,curr和parent似乎应该exchange才配得上名字。
可以先试试写recursion的。

【在 e******i 的大作中提到】
: Hi leetcode上我有道题看不明白,求教各位大神。
: 是关于flatten binary tree to linkedlist那道。
: 我看到一个答案。
: public class Solution {
: 03 public void flatten(TreeNode root) {
: 04 if(root==null)
: 05 return;
: 06
: 07 TreeNode curr=null;
: 08 Stack trees=new Stack();

avatar
c*t
5
太赞了

【在 l*******b 的大作中提到】
: 贴个我写的。。。
: void flatten2(TreeNode *r) { // In place way
: while(r) {
: if(r->right == NULL) {
: r->right = r->left;
: r->left = NULL; // leetcode require this
: } else if(r->left != NULL) {
: TreeNode *t = r->left;
: while(t->right)
: t = t->right;

avatar
p*2
6
这道题我不明白为什么最后转成了单链表。难道不应该是双链表吗?CC150上的原题。
单链表貌似简单了。
avatar
l*b
7
有了单链表,再遍历一遍到双链表就是了吧?

【在 p*****2 的大作中提到】
: 这道题我不明白为什么最后转成了单链表。难道不应该是双链表吗?CC150上的原题。
: 单链表貌似简单了。

avatar
p*2
8

你可以试试只扫一遍。

【在 l*******b 的大作中提到】
: 有了单链表,再遍历一遍到双链表就是了吧?
avatar
l*b
9
嗯,加个指针p,在递归到下一层时把r存下来就可以了
开始加一个
TreeNode *p = NULL;
最后一段改成:
r->left = p;
p = r;
r = r->right;

【在 p*****2 的大作中提到】
:
: 你可以试试只扫一遍。

avatar
c*t
10
似乎可行
记得有一个题是bstin-place 转成从小到大的double linked list.有空做做看。

【在 l*******b 的大作中提到】
: 嗯,加个指针p,在递归到下一层时把r存下来就可以了
: 开始加一个
: TreeNode *p = NULL;
: 最后一段改成:
: r->left = p;
: p = r;
: r = r->right;

avatar
e*i
11

哈哈,大神说的果然通俗易懂,我明白了。
谢谢!

【在 c*****a 的大作中提到】
: while()前半是preorder-traverse
: 后半段这里就是连接部份
: 31 curr.right=parent;
: 32 curr=curr.right;
: 你把名字parent改为curr, curr改为prev这样的容易明白了

avatar
p*g
12
public void flatten(TreeNode root) {
flat(root);
}

public TreeNode flat(TreeNode root) {
if (root==null) return null;
TreeNode rv = root;
TreeNode rt = root.right;
root.right = flat(root.left);
root.left = null;
while (root.right!=null) root = root.right;
root.right = flat(rt);
return rv;
}

【在 e******i 的大作中提到】
: Hi leetcode上我有道题看不明白,求教各位大神。
: 是关于flatten binary tree to linkedlist那道。
: 我看到一个答案。
: public class Solution {
: 03 public void flatten(TreeNode root) {
: 04 if(root==null)
: 05 return;
: 06
: 07 TreeNode curr=null;
: 08 Stack trees=new Stack();

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。