注册 登录
编程论坛 C++教室

leetcode114

归鸿唱晚 发布于 2018-12-04 20:26, 1872 次点击
程序代码:
struct TreeNode {
     int val;
     TreeNode *left;
     TreeNode *right;
     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  };

class Solution {
public:
    void flatten(TreeNode* root) {//后序遍历;
       if(root==NULL)return;  
       flatten(root->left);     
       flatten(root->right);   
       TreeNode *temp=root->right;     
       root->right=root->left;      
       root->left=NULL;     
       while(root->right)root=root->right;   
       root->right=temp;
    }
};
只有本站会员才能查看附件,请 登录

while那行改变了root,root不就不是头结点了吗,这么做为什么没有问题?
5 回复
#2
归鸿唱晚2018-12-04 20:27
回复 楼主 归鸿唱晚
只有本站会员才能查看附件,请 登录
#3
归鸿唱晚2018-12-04 20:27
回复 楼主 归鸿唱晚
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2018-12-4 20:31编辑过]

#4
Jonny02012018-12-04 22:54
其实就是不断通过递归将左枝转成右枝
这个明显是先序, 不是后序
改变 root 是因为不断让 root 寻找自己的右节点, 直到底部为止, 然后把 temp 挂上去
如果改成循环, 不用递归, 就要多一个 cursor, 而不是直接改 root, 此时 while 循环里面的 root 就会变成 cursor
这个就好理解多了
#5
rjsp2018-12-05 09:18
void flatten(TreeNode* root)
root 是传值过来的,在函数内部修改的也只是一个副本

BTW:直接贴原题链接,少贴图 https://
#6
归鸿唱晚2018-12-05 19:16
回复 3楼 归鸿唱晚
懂了,谢谢了各位!
1