leetcode114.二叉树展开为链表

ⅰ亾dé卋堺 提交于 2020-01-30 18:54:34

给定一个二叉树,原地将它展开为链表。

例如

给定二叉树:

    1
   / \
  2   5
 / \   \
3   4   6
将其展开为:

1
 \
  2
   \
    3
     \
      4
       \
        5
         \
          6

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

完整代码

基本思想
递归

  • 先将根的右子树展平
  • 再将左子树展平,同时将展平的左子树插入到根和右子树之间,这时候需要找到展平的左子树的叶子节点,让叶子节点连接右子树。
  • 递归上述过程
/**
 * 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) {
        //原地展开思想:
        //将根的左子树链接在根的右孩子下,根的右子树链接在左子树下
        move(root);
    }
private:
    TreeNode* move(TreeNode* root){
        TreeNode *temp;
        if(root == NULL)
            return NULL;
        if(root->right){//向将右子树展平
            root->right = move(root->right);
        }
        if(root->left){//将左子树展平
            temp = root->right;//临时保存右子树
            
            TreeNode *p = move(root->left);//保存展平的左子树的根            
            root->right = p;//链接在根的右子树上
            while(p->right)//寻找右子树的叶子
                p = p->right;
            p->right = temp;//将之前的右子树连接上
            
            root->left = NULL;
        }
        return root;    
    }
};

后序遍历思想

/**
 * 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 == NULL)
            return;             
        flatten(root->left);
        flatten(root->right);
        TreeNode *temp = root->right;
        TreeNode *p = root->left;
        root->left = NULL;
        if(p){//根有左子树时
            root->right = p;
            while(p->right)
                p = p->right;
            p->right = temp;
        }       
    }
};

说明:看到评论区发现这是先序遍历,其实可以在先序遍历的过程中来改变节点的右指针的指向。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!