LeetCode题解——Flatten Binary Tree to Linked List

来源:互联网 发布:下拉菜单获取数据库 编辑:程序博客网 时间:2024/06/05 14:13

Given a binary tree, flatten it to a linked list in-place.

For example,
Given

         1        / \       2   5      / \   \     3   4   6

The flattened tree should look like:
   1    \     2      \       3        \         4          \           5            \             6
Hints:

If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.

思路一:递归,将左子树展成一列,将右子树展成一列,然后再拼接左子树和右子树

/** * 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;        flatten(root->left);        flatten(root->right);        if(root->left){            TreeNode* t = root->left;            while(t->right){                t=t->right;            }            t->right = root->right;            root->right = root->left;            root->left = NULL;        }    }};

思路二:不用递归,用循环。首先将根节点的左子树变为NULL,具体操作为:将根节点的左子树的最右的节点指向根节点的右子树,然后将根节点的右指针指向根节点的左子树,再将左子树置为NULL。然后处理在处理根节点的右子树,把右子节点看做根节点,重复上述步骤。

/** * 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) {        while(root){            if(root->left && root->right){                TreeNode* t = root->left;                while(t->right){                    t = t->right;                }                t->right = root->right;            }                        if(root->left){                root->right = root->left;                root->left = NULL;            }            root= root->right;        }    }};



0 0