文章目录
- 前言
- 题目
- 解决方案一
- 1.1 思路阐述
- 1.2 源码
- 解决方案二
- 2.1 思路阐述
- 2.2 源码
- 总结
前言
自己在草稿纸上模拟这个遍历的过程比较简单,但是转移到代码上就突然会懵逼。这个在我之前学数据结构,做到这个实验的时候觉得很难理解。最近虽然已经入职了,但是刷刷题巩固一下基础的时候,还是会受益良多。
题目
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
数据范围:二叉树的节点数量满足 1 ≤ n ≤ 100 1≤n≤100 1≤n≤100,二叉树节点的值满足 1 ≤ v a l ≤ 100 1≤val≤100 1≤val≤100,树的各节点的值各不相同
输入:
{ 1 , # , 2 , 3 } \{1,\#,2,3\} {1,#,2,3}
这里#表示空,对应1没有左节点。
返回值:
[ 1 , 2 , 3 ] [1,2,3] [1,2,3]
解决方案一
1.1 思路阐述
这道题思路上面没什么讲的,比较简单。
首先要明白前序遍历是是什么:
一棵树有根节点,根节点下面有左子树和右子树。左子树和右子树的根节点为这棵树根节点的左节点和右节点。
前序遍历的意思就是,根左右
。先遍历根节点再遍历左子树和右子树。
1.2 源码
/*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/
#include <cstddef>
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可* @param root TreeNode类 * @return int整型vector*/vector<int> temp;vector<int> preorderTraversal(TreeNode* root) {if(!root)//如果节点为空,则返回原数组return temp;temp.push_back(root->val);//不为空则表示遍历到这个节点,将这个节点的值添加到数组中preorderTraversal(root->left);//遍历当前子树的左节点preorderTraversal(root->right);//遍历当前子树的右节点return temp;}
};
解决方案二
2.1 思路阐述
做完题之后简单看了下题解,官方的题解就是把部分处理过程单独拎出来做一个函数。
思路什么的都是差不多的,这里就贴一下代码。
2.2 源码
class Solution {
public:void preorder(vector<int> &res, TreeNode* root){//遇到空节点则返回if(root == NULL) return;//先遍历根节点res.push_back(root->val); //再去左子树preorder(res, root->left); //最后去右子树preorder(res, root->right); }vector<int> preorderTraversal(TreeNode* root) {vector<int> res; //递归前序遍历preorder(res, root); return res;}
};
总结
数据结构的东西有时候比较抽象,算法思想到代码的转换需要自己好好琢磨。
之前做算法题的时候,觉得很奇怪,为什么讲算法原理,明白了,但是具体上手题目的时候,就是一脸懵逼,告诉你怎么写了,还是不会写。
究其本质就是写到少,想的少;事必躬亲可能才是唯一解吧。