【数据结构与算法】二叉树基础OJ -- 上 (巩固提高)-2

简介: 【数据结构与算法】二叉树基础OJ -- 上 (巩固提高)-2

【数据结构与算法】二叉树基础OJ -- 上 (巩固提高)-1https://developer.aliyun.com/article/1456936


leetcode 144.二叉树的前序遍历(需要数组存储)

题目来源:144. 二叉树的前序遍历 - 力扣(LeetCode)


题目描述:

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。


示例:

00b88033e4cf4189968fd85fb64733f5.png



解题思路:

       首先用TreeSize函数算出二叉树的节点数量,具体实现看这篇文章:http://t.csdnimg.cn/DvuEU


      接着用*returnsize这个值接收,为什么要解引用?因为传过来的是size的地址-->&size


图解在这:实现其main函数:


5995163aafb0413a8798d24bc75e54ed.png


        接着malloc一块空间,定义指针int*a指向,定义变量i,接着传入preorder函数,进行前序遍历,之后返回a的地址。


代码实现:


int TreeSize(struct TreeNode* root)
{
    return root == NULL ? 0:TreeSize(root->left) + TreeSize(root->right)+1; 
}
void preorder(struct TreeNode*root,int*a,int*i)
{
    if(root==NULL)
    {
        return ;
    }
    a[(*i)++]=root->val;
    preorder(root->left,a,i);
    preorder(root->right,a,i);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    *returnSize = TreeSize(root);
    int* a= malloc(*returnSize*sizeof(struct TreeNode));
    int i=0;
    preorder(root,a,&i);
    return a;
}


执行:


1e24514f092146918d124bac2b6e0cf0.png

关于此题有两个疑问:


       1.用局部变量,下面的这个代码可以吗?


int TreeSize(struct TreeNode* root)
{
    return root == NULL ? 0:TreeSize(root->left) + TreeSize(root->right)+1; 
}
void _preorder(struct TreeNode* root, int* a,int i)
{
  if (root == NULL)
  return;
  //用指针的方式是为了不在不同栈帧内创建i
  a[i++] = root->val;
  _preorder(root->left, a,i);
  _preorder(root->right, a,i);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
  *returnSize = TreeSize(root);
  int* a = (int*)malloc(*returnSize * sizeof(int));
  int i = 0;
  _preorder(root,a,i);
  return a;
}


结果是不行,为什么?用局部变量就不行吗?



971bbad259c64b32b4e78531bbc1401d.png

以下是我的理解:


f76322b6a3304d18b82ff36d5db4b603.png


2.全局变量可以吗?


       可以,但是先列举问题:

0652babe9be940a2bfb6a59809f29767.png


解析:        


虽然全局变量 i 在定义时已经被初始化为 0,但是全局变量的赋值操作只会在程序启动时执行一次。每次调用 _preorder 函数时,由于没有显式地给 i 赋新的值,i 的值会保持上一次调用结束时的值。这样会导致多次调用 _preorder 函数时,节点值被存储在错误的位置,结果可能不符合预期。
        因此,在函数内部显式地给 i 赋值为 0,可以确保每次调用 _preorder 函数时都从数组 a 的开头位置开始存储节点的值,避免出现错误的索引位置。

leetcode 572.另一棵树的子树

题目来源:572. 另一棵树的子树 - 力扣(LeetCode)


题目描述:

     

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
        二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

示例:


00b32b1a58bc4d1da7b99d396d6789ab.png


解题思路:

首先,判断 root 是否为 NULL,如果是,则不存在子树,返回 false。
接着,调用 isSameTree 函数,判断 root 和 subRoot 是否相同,如果是,则 subRoot 是 root 的子树,返回 true。
如果以上条件都不满足,递归调用 isSubtree 函数,分别判断 subRoot 是否是 root 的左子树的子树,或者是 root 的右子树的子树。只要有一边存在子树,就返回 true。
如果都不满足,则 subRoot 不是 root 的子树,返回 false。

图解:


8b3eb6012a31426b98d64e4d8c64406c.png


代码实现:


bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    //找确定的条件
    if(p == NULL && q == NULL)
        return true;
   
    if(p == NULL || q == NULL)
        return false;
    if(p->val !=q->val)
        return false;
 
    return isSameTree(p->left,q->left) 
    && isSameTree(p->right,q->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
   
    if(root==NULL)
    {
        return false;
    }
    if(isSameTree(root,subRoot))
    {
        return true;
    }
    return isSubtree(root->left,subRoot) 
    || isSubtree(root->right,subRoot);
}


代码执行:


  06631a9045094dc5b2156088b7bda6a7.png    

相关文章
|
2月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
75 9
 算法系列之数据结构-二叉树
|
3月前
|
DataX
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
4月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
118 12
|
4月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
111 10
|
4月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
146 2
|
5月前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
97 5
|
5月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
6月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
192 4
|
6月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
12天前
|
算法 数据安全/隐私保护
基于GA遗传算法的悬索桥静载试验车辆最优布载matlab仿真
本程序基于遗传算法(GA)实现悬索桥静载试验车辆最优布载的MATLAB仿真(2022A版)。目标是自动化确定车辆位置,使加载效率ηq满足0.95≤ηq≤1.05且尽量接近1,同时减少车辆数量与布载时间。核心原理通过优化模型平衡最小车辆使用与ηq接近1的目标,并考虑桥梁载荷、车辆间距等约束条件。测试结果展示布载方案的有效性,适用于悬索桥承载能力评估及性能检测场景。

热门文章

最新文章