From:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/
给定一个二叉树,原地将它展开为一个单链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:1
\
2
\
3
\
4
\
5
\
6
思路
从样例的结果来看,链表为二叉树前序遍历的结果;
但是如果根据前序遍历来遍历二叉树的话,节点无法预知它的right节点(链表中节点的下一个节点)应该指向哪里;
如果倒过来遍历,即遍历顺序变成6,5,4,3,2,1的话,可以每经过一个节点就将它保存,到达下一个节点的时候就可以作为它的前驱节点;
根据这个思路便是后序遍历,遍历的顺序为右左中
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
// 保存前驱节点
TreeNode* pre;
void flat(TreeNode* root){
// 节点为空,直接返回
if(root== NULL) return ;
// 先进入右子树,然后再进入左子树
flat(root->right);
flat(root->left);
// pre为空,说明是第一个节点
if(pre== NULL)
pre= root;
else{
// 将当前节点的右指针指向前驱节点
root->left= NULL;
root->right= pre;
pre= root;
}
}
void flatten(TreeNode* root) {
pre= NULL;
flat(root);
}
};