将一棵二叉树按照前序遍历拆解成为一个假链表
。所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针。
注意事项
不要忘记将左儿子标记为 null,否则你可能会得到空间溢出或是时间溢出。
样例
1
\
1 2
/ \ \
2 5 => 3
/ \ \ \
3 4 6 4
\
5
\
6
/**
* 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:
*/
void flatten(TreeNode * root) {
// write your code here
if(root == NULL)//root为空直接返回
{
return ;
}
else if(root->left == NULL &&root->right == NULL)//root左右节点为空,直接返回
{
return ;
}
else if(root->left != NULL && root->right == NULL)//左节点不为空,右节点为空
{
root->right = root->left;//根节点的右节点指向原来的左节点
root->left = NULL;//根节点原来节点置为NULL
flatten(root->right);//对右节点重新调整
}
else if(root->left == NULL && root->right != NULL)//左节点为空,右节点不为空
{
flatten(root->right);//直接对右节点调整
}
else//左右节点都不为空,对左节点调整后,找到左节点调整后的首端和尾端,首端连接根节点的右节点,尾端连接根节点原来的右节点,在对原 //来右节点调整
{
flatten(root->left);//对左节点调整
TreeNode *temp1 = root->left;//用来存左节点调整后的尾端
while(temp1->right != NULL)//找尾端
{
temp1 = temp1->right;
}
temp1->right = root->right;//尾端的右节点连接原来根节点的右节点
root->right = root->left;//根节点的右节点连接调整左节点的首端及原左节点
root->left = NULL;//跟节点的左节点置为空
flatten(temp1->right);//对跟节点的原右节点调整
}
}
};