首页 > 其他分享 >LeetCode144 二叉树的前序遍历

LeetCode144 二叉树的前序遍历

时间:2024-08-08 16:55:35浏览次数:14  
标签:right TreeNode LeetCode144 递归 前序 nullptr val 二叉树 left

前言

题目: 144. 二叉树的前序遍历
文档: 代码随想录——二叉树的递归遍历
编程语言: C++
解题状态: 基础知识不了解

思路

两种思路,第一是递归。

递归算法有三个要素。每次写递归,都按照这三要素来写!

  1. 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。

  2. 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。

  3. 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

第二种迭代的方法需要借助栈来实现。

代码

方法一:递归法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& vec) {
        if (cur == NULL) return;
        vec.push_back(cur -> val);
        traversal(cur -> left, vec);
        traversal(cur -> right, vec);
    }
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        traversal(root, res);
        return res;
    }
};
  • 时间复杂度: $$
  • 空间复杂度: $$

方法二:迭代法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> res;
        if (root == NULL) return res;
        st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            res.push_back(node -> val);
            if (node -> right) st.push(node -> right);
            if (node -> left) st.push(node -> left);
        }
        return res;
    }
};
  • 时间复杂度: $$
  • 空间复杂度: $$

标签:right,TreeNode,LeetCode144,递归,前序,nullptr,val,二叉树,left
From: https://blog.csdn.net/daishabby2486/article/details/141018267

相关文章

  • 二叉树的递归套路
    二叉树的递归套路二叉树结构二叉树是一个将数据组织成头尾相连的特殊链表,每一个数据单元与链表一样有一个指向其的指针,但与链表不同的是其可以有两个指向其他单元的指针,分别是其左孩子与右孩子。采用该这种结构,最终数据的呈现形式会与“链”不一样,而呈现出了一种树的结构。对......
  • Java数据结构 | 二叉树基础及基本操作
    二叉树一、树型结构1.1树的概念1.2关于树的一些常用概念(很重要!!!)1.3树的表示形式1.4树的应用二、二叉树2.1二叉树的概念2.2两种特殊的二叉树2.3二叉树的性质2.4二叉树的存储2.5二叉树的基本操作2.5.1代码说明2.5.2二叉树的遍历2.5.3二叉树的基本操作1、获取树......
  • 是你的java二叉树啊啊啊
    1.二叉树的最大深度问题:计算二叉树的最大深度(或高度)。Java实现:publicclassTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(intx){val=x;}}publicclassSolution{publicintmaxDepth(TreeNoderoot){if(root==......
  • 【平衡二叉树】数据结构—平衡二叉树
    平衡二叉树(BalancedBinaryTree)是一种特殊的二叉树,它的左右子树的高度差不超过1,这样可以保证树的高度相对较低,从而使得查找、插入和删除操作的时间复杂度保持在。平衡二叉树的基本概念1.二叉树:每个节点最多有两个子节点,分别称为左子节点和右子节点。2.平衡条件:对于每个......
  • 二叉树刷题,bfs刷题
    有些题目,你按照拍脑袋的方式去做,可能发现需要在递归代码中调用其他递归函数计算字数的信息。一般来说,出现这种情况时你可以考虑用后序遍历的思维方式来优化算法,利用后序遍历传递子树的信息,避免过高的时间复杂度。遍历,对每一个结点进行操作,可以是找这个结点的旁边结点也可以......
  • 二叉树递归解决问题刷题 (一)
    遇到和深度相关的题目,可以用dfs递归遍历深度获取bfs结果来做513.找树左下角的值如何找二叉树最底层最左边节点的值呢,就是dfs遍历深度,来获取,最后一层的第一个元素就是。classSolution:def__init__(self):#记录二叉树的最大深度self.maxDepth=......
  • NC 实现二叉树先序,中序和后序遍历
    系列文章目录文章目录系列文章目录前言前言前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。描述给定一棵二叉树,分别按照二叉树先序,中序和后序打印所有的节点。i......
  • Day21 二叉树Part8
    目录任务669.修剪二叉搜索树思路108.将有序数组转换为二叉搜索树思路538.把二叉搜索树转换为累加树思路心得体会任务669.修剪二叉搜索树给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值在[low,high]中。修剪树不......
  • 手撕数据结构之二叉树
     1.树树的基本概念与结构树是⼀种⾮线性的数据结构,它是由n(n>=0)个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。•有⼀个特殊的结点,称为根结点,根结点没有前驱结点。•除根结点外,其余结点被分成M(M>0)......
  • 数据结构 顺序与链式二叉树的原理与实现(万字)
    目录一、树概念及结构树的概念树的相关概念树的表示二、二叉树概念及结构概念特殊的二叉树二叉树的性质二叉树的存储结构三、二叉树的顺序结构及实现二叉树的顺序结构堆的概念及结构堆的实现堆向下调整算法堆的创建建堆时间复杂度堆的插入堆的删除堆的代码实现Heap.hHeap.c堆的应......