【数据结构】二叉树的前序遍历(七)

这篇具有很好参考价值的文章主要介绍了【数据结构】二叉树的前序遍历(七)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 题目:二叉树的前序遍历

题目详情:给你二叉树的根节点 root ,返回它节点值的 前序 遍历;

我们先来看几个示例:

【数据结构】二叉树的前序遍历(七),算法,数据结构,c语言,开发语言,排序算法

输入:root = [ 1,null,2,3 ]

输出:[ 1,2,3 ]

 示例2:

【数据结构】二叉树的前序遍历(七),算法,数据结构,c语言,开发语言,排序算法

输入:root = [ 1,2 ]

输出:[ 1,2 ]

示例三:

输入:root = [  ]

输出:[  ]

提示:

树中结点数目在范围【0,100】内

-100 <= Node.val <= 100

开始分析:

通过以上的示例我们得知,这道题呢就是把一棵树用前序遍历的方式将结点的值赋给一个数组,然后返回这个数组的指针;

我们之前学过二叉树的前序遍历打印结点的值,现在是将结点的值储存起来,其实原理都一样;

这个是要实现的函数的基本信息;

int* preorderTraversal(struct TreeNode* root, int* returnSize)

思路实现:

我们首先要确定数组的大小,数组的个数等于树中结点的个数,所以我们要先计算树中结点的个数;

int TreeSize(struct TreeNode* root)
{
    return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
}   
//算结点的个数
*returnSize=TreeSize(root);

这个计算树结点个数的函数之前有些过,大体思路就是树结点的总和等于 根结点本身加上左,右子树的结点个数;

然后数组的元素个数知道了就要开始申请动态空间来定义数组了;

//开辟动态空间
int* arr=(int*)malloc(sizeof(int)*(*returnSize));

直接一个 malloc 拿下,元素类型与树结点的值类型一致;

然后数组也有了我们就要对其赋值了;

易错点:

1,前序遍历是需要用递归来实现的,不能直接在主函数里递归,因为主函数里有开辟动态空间还挺大的,会造成堆溢出,所以我们需要用另外一个函数来进行赋值操作;

void _preorderTraversal(struct TreeNode* root,int* arr)
 {
     if(root==NULL)
     {
         return ;
     }
     int i=0;
     arr[i++]=root->val;
     _preorderTraversal(root->left,arr);
     _preorderTraversal(root->right,arr);
 } 
  
    //赋值
     _preorderTraversal(root,arr);

【数据结构】二叉树的前序遍历(七),算法,数据结构,c语言,开发语言,排序算法

初学者们经常犯的错误,这里很明显错误的是下标 i 在递归调用函数时的不断重置,那我们把下标 i 放在主函数里是不是就可以解决呢?

void _preorderTraversal(struct TreeNode* root,int* arr,int i)
 {
     if(root==NULL)
     {
         return ;
     }
     arr[i++]=root->val;
     _preorderTraversal(root->left,arr,i);
     _preorderTraversal(root->right,arr,i);
 }   
int i=0;
//赋值
_preorderTraversal(root,arr,i);

【数据结构】二叉树的前序遍历(七),算法,数据结构,c语言,开发语言,排序算法

这为什么也通过不了呢?很简单,每一次调用的下标 i 只是上一个函数的形参而已,形参的改变不会影响实参!

这有人就会问呀那也运行成功了一半呀! 那是因为能运行成功的树都是【斜树】这种树都只有一边的,我前面也介绍过;

斜树图示:

【数据结构】二叉树的前序遍历(七),算法,数据结构,c语言,开发语言,排序算法

对,就是这种树才程序才可以通过,那为什么其他树不可以呢?因为像【斜树】这种每次的函数返回都是空并不涉及下标 i 的值的改变,但是其他树呢,就比如这棵树;

【数据结构】二叉树的前序遍历(七),算法,数据结构,c语言,开发语言,排序算法

当函数走到 D 点的时候下标 i 为3,然后返回 B 开始给其右子树 E 赋值

此时 E 中下标 i 的值是 4 吗?并不是! D 中改变 i 的值出了函数就失效了形参的改变不能影响实参,所以此时 E 中下标 i 的值还是 2 ,因此程序通过不了了;

所以既然传值不行,那我们就传地址嘛,这样下标 i 就可以灵活变通了;

void _preorderTraversal(struct TreeNode* root,int* arr,int* i)
 {
     if(root==NULL)
     {
         return ;
     }
     arr[(*i)++]=root->val;
     _preorderTraversal(root->left,arr,i);
     _preorderTraversal(root->right,arr,i);
 }  

 int i=0;
 //赋值
  _preorderTraversal(root,arr,&i);

【数据结构】二叉树的前序遍历(七),算法,数据结构,c语言,开发语言,排序算法

这样就ok了,还有人说用全局变量也行,那我们来看看;

int i=0;
void _preorderTraversal(struct TreeNode* root,int* arr)
 {
     if(root==NULL)
     {
         return ;
     }
     arr[i++]=root->val;
     _preorderTraversal(root->left,arr);
     _preorderTraversal(root->right,arr);
 }    

//赋值
 _preorderTraversal(root,arr);

【数据结构】二叉树的前序遍历(七),算法,数据结构,c语言,开发语言,排序算法

大家忽略了一个问题,这种方式只能是一次性的;

因为全局变量 i 的值会一直变化且保存的,而要通过的话是要进行大量测试的,要调用很多次函数而每一次调用函数下标 i 的值都是在上个函数里调用过的值,并没有重置,所以调用多了下标 i 就会无限大就会越界访问了;

源代码:

void _preorderTraversal(struct TreeNode* root,int* arr,int* i)
 {
     if(root==NULL)
     {
         return ;
     }
     arr[(*i)++]=root->val;
     _preorderTraversal(root->left,arr,i);
     _preorderTraversal(root->right,arr,i);
 }

int TreeSize(struct TreeNode* root)
{
    return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
}

int* preorderTraversal(struct TreeNode* root, int* returnSize){
    //算结点的个数
    *returnSize=TreeSize(root);
    //开辟动态空间
    int* arr=(int*)malloc(sizeof(int)*(*returnSize));
    int i=0;
    //赋值
     _preorderTraversal(root,arr,&i);
     return arr;
}

这就是这道题的解题思路以及易错点了,写程序还是得细心得全面,特别是递归问题考虑的东西就更多了;

这阶段也还是带大家刷一些常见且经典的题目,掌握算法形成思路!

后面博主会陆续更新;

如有不足之处欢迎来补充交流!

完结。文章来源地址https://www.toymoban.com/news/detail-723405.html


到了这里,关于【数据结构】二叉树的前序遍历(七)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】二叉树的前中后序遍历(C语言)

    [二叉树] 顾名思义就是有 两个分支节点的树,不仅如此,除了叶子外的所有节点都具有两个分支节点; 由于结构像一棵倒立的树,顾名思义为二叉树 ; 如下图所示,该图即为一棵 野生的二叉树 ; 既然二叉树为树,固然有着和树一样的部分( 叶子、根、分支… ) 这些也成为

    2024年02月17日
    浏览(31)
  • 二叉树 | 二叉树的前序遍历问题

    二叉树的前序遍历问题描述 提供二叉树的根节点 root ,返回它节点值的 前序   遍历。 二叉树的前序遍历是一种深度优先遍历(DFS)的方式,其遍历顺序为:先访问根节点,然后递归地对左子树进行前序遍历,最后递归地对右子树进行前序遍历。 二叉树的定义 在Java中,二

    2024年02月01日
    浏览(33)
  • 【Java数据结构】二叉树的前中后序遍历(递归和非递归)

    二叉树遍历是二叉树的一种重要操作 必须要掌握 二叉树的遍历可以用递归和非递归两种做法来实现 前序遍历的遍历方式是 先根节点 在左节点 在右节点 述这棵树前序遍历的结果是: A B D E C F G 递归的思想就是把问题拆分成一个个小问题来解决 treeNode是一个内部类 具体实现

    2023年04月26日
    浏览(39)
  • 144.二叉树的前序遍历

    2024年01月22日
    浏览(26)
  • 二叉树的前序遍历(力扣144)

    目录 题目描述: 解法一:递归法 解法二:迭代法 解法三:Morris 遍历 二叉树的前序遍历 给你二叉树的根节点  root  ,返回它节点值的  前序   遍历。 示例 1: 示例 2: 示例 3: 示例 4: 示例 5: 提示: 树中节点数目在范围  [0, 100]  内 -100 = Node.val = 100 复杂度分析 时间复

    2023年04月17日
    浏览(25)
  • 二叉树(下)+Leetcode每日一题——“数据结构与算法”“对称二叉树”“另一棵树的子树”“二叉树的前中后序遍历”

    各位CSDN的uu们你们好呀,今天小雅兰的内容仍然是二叉树和Leetcode每日一题,下面,就让我们进入二叉树的世界吧!!! 这个题目需要重新定义一个函数,函数参数需要有左子树和右子树,题目所给定的函数无法解决问题。 每个不为空的结点,都可以认为是一棵子树的根 

    2024年02月16日
    浏览(31)
  • 144. 二叉树的前序遍历-C++

    题目来源:力扣 示例 1: 示例 2: 代码实现:  思路: 我们用这棵树来举例   我们在访问一棵树,按照前序遍历,我们最先访问的是左路节点,也就是8,3,1,所以我们就可以把树分为两个部分,一个是左路节点,另一个就是左路节点的右子树,我们把左路节点入栈 然后我

    2024年02月11日
    浏览(26)
  • Leetcode 144. 二叉树的前序遍历

    题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/description/

    2024年02月15日
    浏览(43)
  • 【LeetCode】144.二叉树的前序遍历

    示例 1: 输入:root = [1,null,2,3] 输出:[1,2,3] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1] 示例 4: 输入:root = [1,2] 输出:[1,2] 示例 5: 输入:root = [1,null,2] 输出:[1,2] 提示 : 树中节点数目在范围 [0, 100] 内 -100 = Node.val = 100 中序遍历的规则是 根-左-右,

    2023年04月24日
    浏览(22)
  • LeetCode.144. 二叉树的前序遍历

    144. 二叉树的前序遍历 这道题目是比较基础的题目,我们首先要知道二叉树的前序遍历是什么? 就是【 根 左 右 】 的顺序,然后利用递归的思想,就可以得到这道题的答案,任何的递归都可以采用 栈 的结构来实现,所以我会写两种方式来解决这道题目。 递归版本 非递归版

    2024年02月19日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包