首页 > 系统相关 >使用 O(1) 额外内存删除二叉树

使用 O(1) 额外内存删除二叉树

时间:2024-09-16 14:35:26浏览次数:1  
标签:额外 TreeNode 内存 next tail right 二叉树 root left

这是一个 naive 的做法:

void deleteTreeRec(TreeNode *root){
   if (root == NULL) return;
   deleteTreeRec(root->left);
   deleteTreeRec(root->right);
   cout << "Deleting node " << root->data << endl;
   delete root;
}

O(1) 空间的做法如下:

把树的左侧节点看成一条链,我们的目的就是不断把当前 root 节点的右子树挪到这条链的末尾,最终可以把这棵树展平为一条链。

而在展开的过程中我们可以删除这条链的头节点(即root节点),最后可以把这条链删除干净。

void deleteTree(TreeNode* root) {
    TreeNode* tail = root;
    while (root != nullptr){
        // update tail
        while (tail->left != nullptr) {
            tail = tail->left;
        }
        // move right to the end of the "list"
        // needs to happen before retrieving next, since the node may only have a right subtree
        tail->left = root->right;
        // need to retrieve the data about the next
        TreeNode* next = root->left;
        delete root;
        root = next;
    }
}

标签:额外,TreeNode,内存,next,tail,right,二叉树,root,left
From: https://www.cnblogs.com/sparkyen/p/18416267

相关文章

  • 共享内存的理解
     目录直接原理原理图​编辑直接代码创建唯一键值代码 创建共享内存代码 共享内存的指令操作  简单封装补充指令集系统设计的只能本地进行通信;直接原理共享内存也是进程间通信的方案原理图理解:1.  所有图中所说的操作都是os所做的 2.  os必须提......
  • 力扣热题100 - 二叉树:二叉搜索树中第 K 小的元素
    题目描述:题号:230给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从1开始计数)。解题思路:思路一:中序遍历二叉树+ 计数根据二叉搜索树的性质,中序遍历得到的节点的顺序是从小到大递增的。所以可以一边中序遍历,一边计数......
  • 力扣热题100 - 二叉树:二叉树展开为链表
    题目描述:题号:114给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。解题思路:思路一:前序遍历后......
  • C++数据结构-二叉树的三种遍历方法(进阶篇)
    1.遍历简介:树作为非线性数据结构,在我们取出数据时就需要设计遍历,所谓遍历,就是按照一定的规则性,将数据结构中的所有数据全部依次访问,而二叉树本身并不具有天然的全局次序,故为实现遍历,需通过在各节点与其孩子之间约定某种局部次序,间接地定义某种全局次序,这便是我们常规定的先序......
  • C++数据结构-二叉树的存储方法(基础篇)
    1.简介根据前文的介绍,我们知道了二叉树的性值,其就是一种每一个结点中只允许拥有左右孩子(或为空)的树,这种数据结构在我们的实际设计中非常常用,如前文提到的STL中的set集合,其底层就是一颗标准的红黑树(二叉树的一种),我们这里以创建一颗二叉树并实现通过特定的插入顺序和读取顺序达......
  • Linux内存管理知识-一篇文章了解堆和栈区别(进阶篇)
    前面已经介绍过,栈是由编译器在需要时分配的,不需要时自动清除的变量存储区。里面的变量通常是局部变量、函数参数等。堆是由malloc()函数分配的内存块,内存释放由程序员手动控制,在C语言为free函数完成。栈和堆的主要区别有以下几点:(1)管理方式不同栈编译器自动管理,无需程序员手......
  • 纯C 生成二叉树广义表 根据广义表重构二叉树
    讲解很多都写在注释里了,重构二叉树的过程后面单独拿出来讲直接上代码:#include<stdio.h>#include<time.h>#include<stdlib.h>#include<limits.h>typedefstructBiTree{ intdata; structBiTree*next[2];}BiTree;BiTree*BiTree_init(intval)//节点初始化{......
  • C++入门基础知识69(高级)——【关于C++ 动态内存】
    成长路上不孤单......
  • 力扣热题100 - 二叉树:验证二叉搜索树
    题目描述:题号:98给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。解题思路:思路一......
  • 内存管理-35-内存统计-1-各成员含义
    基于msm-5.4一、vm_zone_stat[]基础调用路径:clear_page_mlock//mlock.c传参(..,NR_MLOCK,..)mlock_vma_page//mlock.c传参(..,NR_MLOCK,..)account_kernel_stack//fork.c传参(..,NR_KERNEL_STACK_KB,..)scs_account//scs.c传参(..,NR_K......