题目描述:
要求不使用额外空间,并且将二叉树变成链表,首先想到的就是递归的遍历方式。
然而在递归过程中,需要有一个不因递归层数而变化的变量来记录现在已经构造完成的链表的尾部,并不断将遍历过程中的节点加入到链表尾部。
还有一个问题: 用树节点的右孩子指针当做链表的next指针。这就需要保存节点的右孩子,否则就会丢失,递归回到本层时,通过保存右孩子的临时变量来继续进行遍历。而不是通过本层节点的right指针,因为递归回到本层时,本层节点的right指针已经被赋值成为链表的下一个节点。
实现代码如下:
class Solution { public: /** * @param root: a TreeNode, the root of the binary tree * @return: nothing */ TreeNode* ListTail = NULL; void preOrder(TreeNode* root){ if(root){ TreeNode* tmp = root->right; if(ListTail != root){ ListTail->right = root; ListTail->left = NULL; ListTail = root; } preOrder(root->left); preOrder(tmp); } } void flatten(TreeNode * root) { // write your code here if(root == NULL) return ; ListTail = root; preOrder(root); } };