114. Flatten Binary Tree to Linked List**

114. Flatten Binary Tree to Linked List**

https://leetcode.com/problems/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

C++ 实现 1

将二叉树展开成链表

这道题使用递归做很方便, 定义 prev 用于记录当前访问节点的前一个节点.

class Solution {
private:
    // prev 用于记录已经被 flatten 的子树的根节点
    TreeNode *prev = nullptr;
public:
    void flatten(TreeNode* root) {
        if (!root)
            return;
        
        flatten(root->right);
        flatten(root->left);
        root->right = prev;
        root->left = nullptr;
        prev = root;
    }
};

上面代码中最后的 prev = root 就是用于记录当前访问节点的前一个节点, 不过这是在有前面两行代码的前提下. 如果前两行代码没有, 那么代码本身就相当于做一个二叉树的后序遍历. 当有前两行代码, 假设 root->right 已经被 flatten 了, 那么此时 prev 就是指向右子树的根节点, 之后要对左子树进行访问, 由于是后序遍历, 那么访问的第一个节点就是左子树中最右边的节点:

      0
    /   \
   1     2 
  / \
 3  4

如上面的例子, prev 此时指向 2, 而当前访问的节点是 4, 即 root 此时为 4, 那么:

root->right = prev;
root->left = nullptr;
prev = root;

这段代码的意义就是让 4 指向 2, 同时令 prev 指向 4.

发布了394 篇原创文章 · 获赞 8 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Eric_1993/article/details/104687534