【数据结构与算法】二叉树基础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    

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

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问