题目## 题目
题目的主要信息:
- 给定一颗二叉树的根节点,输出其前序遍历的结果
举一反三:
学习完本题的思路你可以解决如下题目:
方法一:递归(推荐使用)
知识点:二叉树递归
递归是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。因此递归过程,最重要的就是查看能不能讲原本的问题分解为更小的子问题,这是使用递归的关键。
而二叉树的递归,则是将某个节点的左子树、右子树看成一颗完整的树,那么对于子树的访问或者操作就是对于原树的访问或者操作的子问题,因此可以自我调用函数不断进入子树。
思路:
什么是二叉树的前序遍历?简单来说就是“根左右”,展开来说就是对于一颗二叉树优先访问其根节点,然后访问它的左子树,等左子树全部访问完了再访问其右子树,而对于子树也按照之前的访问方式,直到到达叶子节点。
从上述前序遍历的解释中我们不难发现,它存在递归的子问题:每次访问一个节点之后,它的左子树是一个要前序遍历的子问题,它的右子树同样是一个要前序遍历的子问题。那我们可以用递归处理:
- 终止条件: 当子问题到达叶子节点后,后一个不管左右都是空,因此遇到空节点就返回。
- 返回值: 每次处理完子问题后,就是将子问题访问过的元素返回,依次存入了数组中。
- 本级任务: 每个子问题优先访问这棵子树的根节点,然后递归进入左子树和右子树。
具体做法:
- step 1:准备数组用来记录遍历到的节点值,Java可以用List,C++可以直接用vector。
- step 2:从根节点开始进入递归,遇到空节点就返回,否则将该节点值加入数组。
- step 3:依次进入左右子树进行递归。
Java实现代码:
import java.util.*;
public class Solution {
public void preorder(List<Integer> list, TreeNode root){
//遇到空节点则返回
if(root == null)
return;
//先遍历根节点
list.add(root.val);
//再去左子树
preorder(list, root.left);
//最后去右子树
preorder(list, root.right);
}
public int[] preorderTraversal (TreeNode root) {
//添加遍历结果的数组
List<Integer> list = new ArrayList();
//递归前序遍历
preorder(list, root);
//返回的结果
int[] res = new int[list.size()];
for(int i = 0; i < list.size(); i++)
res[i] = list.get(i);
return res;
}
}
C++实现代码:
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;
}
};
Python实现代码
class Solution:
def preorder(self, list: List[int], root: TreeNode):
# 遇到空节点则返回
if root == None:
return
# 先遍历根节点
list.append(root.val)
# 再去左子树
self.preorder(list, root.left)
# 最后去右子树
self.preorder(list, root.right)
def preorderTraversal(self , root: TreeNode) -> List[int]:
# 添加遍历结果的数组
list = [<