1、问题描述
将一棵二叉树按照前序遍历拆解成为一个假链表。所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针。样例
1 \ 1 2 / \ \ 2 5 => 3 / \ \ \ 3 4 6 4 \ 5 \ 62、实现思路
按前序遍历,先找到左子树的最右叶子节点,其next为根节点的右子树,根的左子树就变为右子树了,改变根节点为原根节点的右子树,重复之前步骤,直至左子树为空。
3、代码
/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { public: /** * @param root: a TreeNode, the root of the binary tree * @return: nothing */ void flatten(TreeNode *root) { // write your code here if(root==NULL) return ; while(root!=NULL) { TreeNode *p=new TreeNode; p=root->left; if(p!=NULL) { while(p->right!=NULL) p=p->right; p->right = root->right; root->right = root->left; root->left = NULL; } root = root->right; } } };
4、感想
要将左儿子标记为 null,否则会得到空间溢出或是时间溢出。重复操作找到左子树的最右叶子节点,其next为根节点的右子树,根的左子树就变为右子树了,改变根节点为原根节点的右子树,直至没有左子树。