LeetCode二叉树展开为列表
题目描述:
给定一个二叉树,原地将它展开为一个单链表。
例如,给定二叉树
1
/ \
2 5
/ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
想法:
总体:将所有含左子树的结点的左子树都移动到该结点的右指针上,原本的右子树移动到原左子树最右结点(这点要记得注意,一定是移动到最右结点,不然不是顺序结构)。
实现:利用递归,将最下方的含左子树的结点都改为只含右子树的形式。再依次从下往上垒。
代码:
/**
- Definition for a binary tree node.
- struct TreeNode {
-
int val;
-
struct TreeNode *left;
-
struct TreeNode *right;
- };
- **/
void flatten(struct TreeNode* root){
if(NULL == root)
return;
flatten(root->left);
flatten(root->right); //递归使最下方的结点先改变为链表形式
if(root->left) *//改变所有含有左子树的结点*
{
struct TreeNode* p=NULL;
p=root->left;
while(p->right!=NULL)
p=p->right;
p->right=root->right;
root->right=root->left;
root->left=NULL;
}
}
新思路:
/**
- Definition for a binary tree node.
- struct TreeNode {
-
int val;
-
struct TreeNode *left;
-
struct TreeNode *right;
- };
*/
void flatten(struct TreeNode* root){
if(NULL == root)
return;
flatten(root->left);
struct TreeNode* p=root->right;
if(root->left)
{
p=root->left;
while(p->right)
p=p->right;
p->right=root->right;
root->right=root->left;
root->left=NULL;
}
flatten(p);