列表

详情


NC332. 二叉树展开为单链表

描述

给定一个节点个数为n的二叉树,请你把这个二叉树展开为一条单链表。
1.展开后的链表同样是TreeNode,其中right指针指向下一个节点,left节点为空
2.链表的顺序与给定二叉树的先序遍历顺序相同。
3.该题不需要返回链表或者树,请你在原树上面操作,系统会最后检查原树的情况来判断你的代码是否正确
4.该题有O(1)额外空间复杂度的解法,你能实现吗?传入的TreeNode不计入空间复杂度计算
例如:
原二叉树是
展开后是

数据范围:二叉树的节点数满足 ,二叉树节点值满足

示例1

输入:

{1,2,3,4,8}

输出:

{1,#,2,#,4,#,8,#,3}

示例2

输入:

{0}

输出:

{0}

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 46ms, 内存消耗: 9516KB, 提交时间: 2022-06-20

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     */
    void expandTree(TreeNode* root) {
        // write code here
        while(root){
            if(root->left&&root->right){
                TreeNode *t=root->left;
                while(t->right) t=t->right;
                t->right=root->right;
                root->right=root->left;
                root->left=NULL;
                
            }
            else if(root->left){
                root->right=root->left;
                root->left=NULL;
            }
            root=root->right;
        }
    }
};

C 解法, 执行用时: 48ms, 内存消耗: 9480KB, 提交时间: 2022-06-23

void expandTree(struct TreeNode* root ) {
    while (root) {
        if (root->left && root->right) {
            struct TreeNode* t = root->left;
            while (t->right) t = t->right;
            t->right = root->right;
            root->right = root->left;
            root->left = NULL;
        } else if (root->left) {
            root->right = root->left;
            root->left = NULL;
        }
        root = root->right;
    }
}

C++ 解法, 执行用时: 48ms, 内存消耗: 9600KB, 提交时间: 2022-07-02

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     */
    void expandTree(TreeNode* root) {
  if (!root) return;

  TreeNode *node = root;
  TreeNode *prev = root;

  stack<TreeNode *> st;
  st.push(node);
  while (!st.empty()) {
    node = st.top();
    st.pop();
    if (node->right) st.push(node->right);
    if (node->left) st.push(node->left);

    if (node != prev) {
      prev->right = node;
      prev = node;
    }
    prev->left = nullptr;
  }

  prev->right = nullptr;
    }
};

C++ 解法, 执行用时: 49ms, 内存消耗: 9472KB, 提交时间: 2022-06-23

class Solution {
  public:
    void expandTree(TreeNode* root) {
        while (root) {
            if (root->left && root->right) {
                TreeNode* t = root->left;
                while (t->right) t = t->right;
                t->right = root->right;
                root->right = root->left;
                root->left = NULL;
            }
            else if (root->left) {
                root->right = root->left;
                root->left = NULL;
            }
            root = root->right;
        }
    }
};

C++ 解法, 执行用时: 49ms, 内存消耗: 9472KB, 提交时间: 2022-05-24

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     */
    void expandTree(TreeNode* x) {
        while (x) {
            if (x->left && x->right) {
                TreeNode * t = x->left;
                while (t->right) t = t->right;
                t->right = x->right;
                x->right = x->left;
                x->left = NULL;
            } else if (x->left) {
                x->right = x->left;
                x->left = NULL;
            }
            x = x->right;
        }
    }
};

上一题