给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1 / \ 2 5 / \ \ 3 4 6
将其展开为:
1 \ 2 \ 3 \ 4 \ 5 \ 6
题目分析:由题目的例子,我们可以通过以下几步来展开二叉树:
1.首先,将根节点的右子树,连接到根节点的左子树的最右节点,如下图所示:
2.然后将左子树移动到右边,如下图所示:
3.之后,将根节点的右节点 作为 当前的根节点,循环进行。
代码展示:
class Solution {
public:
void flatten(TreeNode* root) {
if(root==NULL)
return;
while(root->right!=NULL || root->left!=NULL){
if(root->left!=NULL){
TreeNode * node = root->left;
while(node->right!=NULL)
node = node->right;
node->right = root->right;
root->right = root->left;
root->left = NULL;
}
root = root->right;
}
}
};
说明,while循环的条件是,只要左右子树有一个为空,则继续循环,以下两种情况都要进行调整操作。
第8-10行表示如果左子树不空,则找到左子树的最右节点。第11行表示将右子树接到左子树最右节点的右边。第12行表示将左子树移动到右边,成为右子树。然后左子树置空。 最后,更新根节点。