/*
关于二叉树的递归遍历:
1. 每次遍历的当前节点都可能有这左右子树 也可能为空 也就是叶节点 叶节点的处理需要单独的处理 而其他非叶接节点的处理流程是一致的
2. 每层递归都需要空节点的判断和叶节点的判断的
/
/*
- Definition for a binary tree node.
- struct TreeNode {
-
int val;
-
TreeNode *left;
-
TreeNode *right;
-
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
- };
/
class Solution {
public:
void flatten(TreeNode root) {
//用于每次递归时候 记录当前单链的尾部位置 特别是叶节点的时候通过将last值返回 从未记录了left_last和right_last
TreeNode *last = NULL;
preOrder(root,last);
}
private:
//指针地址作为形参:返回值是一个地址 需要将这个地址放在一个同类型的指针变量中 所以需要知道这个容器的位置
void preOrder(TreeNode *root,TreeNode *&last){
if(!root){
return ;
}
if(!root->left && !root -> right){
last = root;
return;
}
TreeNode *left = root->left;
TreeNode *right = root ->right;
TreeNode *left_last = NULL;
TreeNode *right_last = NULL;
if(left){
//特别注意:尾结点时候会将last的值返回到left_last中
preOrder(left,left_last);
root->left = NULL;
root -> right = left;
//注意:当root遍历到叶节点的时候 last会置为叶节点的值了 然后递归返回的时候就赋给了left_last了 这个是这个题目最核心的地方
last = left_last;
}
if(right){
preOrder(right,right_last);
if(left_last){
left_last -> right = right;
}
last = right_last;
}
}
};