leetcode-114. Flatten Binary Tree to Linked List 二叉树展开为链表

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;    //一直往后遍历
        }
    }
};

参考:http://www.cnblogs.com/grandyang/p/4293853.html

猜你喜欢

转载自blog.csdn.net/qq_21997625/article/details/86661556