Given a binary tree, flatten it to a linked list in-place. For example, given the following tree: 1 / \ 2 5 / \ \ 3 4 6 The flattened tree should look like: 1 \ 2 \ 3 \ 4 \ 5 \ 6 |
给定一个二叉树,原地将它展开为链表。 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 |
思路:
第一种:递归遍历二叉树,先序遍历二叉树。由题目给出的意思就是按先序遍历(从左到右)序列将每个节点的左子树放到节点 和右子树之间。 那就可以先遍历到最左边节点, 将其放到它的父节点与父节点右子树之间,然后一直递归将每个节点的左子树放到节点和 右子树之间。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void flatten(TreeNode* root) {
if(!root) return ;
if(root->left) flatten(root->left); //递归遍历左右子树
if(root->right) flatten(root->right);
TreeNode* tmp = root->right; //临时节点指向左子树
root->right = root->left; //改变指针指向
root->left = NULL;
while(root->right) root=root->right; //找到左子树的最右子节点
root->right = tmp; //将根节点右子树连到原来左子节点后面
}
};
第二种: 这种思路刚好和上面相反,从右往左来,先判断跟节点是否有左子树,如果有就将其挂到跟节点与右子树之间,然后依次往后遍历
扫描二维码关注公众号,回复:
5144235 查看本文章
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void flatten(TreeNode* root) {
TreeNode* tree = root;
while(tree)
{
if(tree->left)
{
TreeNode* tmp=tree->left; //临时节点指向当前节点左子节点
while(tmp->right) tmp=tmp->right; //遍历到左子树的最右节点
tmp->right = tree->right; //将其接到根节点与右子树之间
tree->right = tree->left;
tree->left = NULL;
}
tree = tree->right; //一直往后遍历
}
}
};