题目要求根据中序遍历,将树的左节点全部移到右节点。
思路:在节点处,判断是否存在左子节点,若存在,则将左子节点拉伸并连接到右子节点之间。
代码:
TreeNode *getTail(TreeNode *head) //获得链表末尾
{
while(head->right)
{
head=head->right;
}
return head;
}
TreeNode* flatTree(TreeNode *node)
{
if(node==NULL)
return NULL;
if(node->left==NULL && node->right==NULL) //叶子节点,直接返回。
return node;
if(node->left!=NULL)
{
TreeNode *left=flatTree(node->left); //获得左节点的拉伸链表
TreeNode *leftTail=getTail(left); //获得拉伸链表末尾
TreeNode *right =node->right;
node->right=left; //将拉伸链表连接在父节点与右节点之间
node->left=NULL; //将父节点的左节点赋为空
leftTail->right=flatTree(right); //点拉伸链表末尾连接原右节点
}
else if(node->right!=NULL) //不存在左节点,则继续遍历右节点
{
node->right=flatTree(node->right);
}
return node;
}
void flatten(TreeNode* root) {
flatTree(root);
}