LC144 二叉树的前序遍历![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/640c419989a39e5cc7739ea90b29de2f.png)
1.读题
给我们二叉树的根节点root
要求返回节点值的前序遍历
提示:
- 树中节点数目在范围[0,100]内
- -100 <= Node.val(节点值) <=100
进阶:
递归算法实现这个是很简单的
挑战自我 你可以使用迭代算法完成这个算法么?
实例1
输入:root = [1,null,2,3] #左子树空 右子树为 2,3
输出:[1,2,3]
实例2
输入:root = []
输出:[]
实例3
输入:root = [1]
输出:[1]
实例4
输入:root = [1,2]
输出:[1,2]
实例5
输入:root = [1,null,2]
输出:[1,2]
2.解题思路
个人想法:
- 先使用中序遍历+前序/后序遍历的结果还原二叉树——大错特错!又没让你还原二叉树 让你做的就是个前序遍历!
- 利用迭代的方法 进行前序遍历——错!这步的逻辑何在…大无语子
官方题解思路:
- 明确二叉树前序遍历的顺序:按照访问根节点——左子树——右子树的方式遍历这棵树
- 访问左子树/右子树的时候 按照如上的方式进行遍历 直到遍历完整棵树
整个遍历过程天然具有递归的性质!
方法一——使用递归函数来模拟这一过程
- 明确递归终止条件——碰到空节点
- 定义preorder(root)表示当前遍历到root节点的答案 我们将root节点的值加入答案
- 递归调用preorder(root.left)来遍历root节点的左子树
- 递归调用preorder(root.rightt)来遍历root节点的右子树 —— 同理
3.C++代码【法一】
// 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 preorder(TreeNode *root,vector<int> &res) {
if (root == NULL) return;
//如果碰到空节点 递归终止
//递归出口是必要的!
res.push_back(root->val); //将根节点值放到结果数组中
//res.push_back(xxx) 在数组res的末尾插入元素xxx
preorder(root->left,res); // 递归左子树
//递归的作用——把遍历到的那个root->val插入res的末尾
preorder(root->right,res); // 递归右子树
return;
}
vector<int>preorderTraversal(TreeNode *root){
// 主函数
vector<int> res; //创建一维数组res
preorder(root, res);//调用写好的前序遍历函数
//两个实参为根节点root 结果数组res从root开始进行遍历
return res;//返回结果数组
}
};
这里注释写得还是很详尽哈 ~
4.python代码 【法一】
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# 初始化函数 ~
# self.val = val
# self.left = left
# self.right = right
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
def preorder(root: TreeNode):
if not root:
return
res.append(root.val)
preorder(root.left)
preorder(root.right)
res = list() #整个列表来存结果数组
preorder(root)
return res
可以看出来 python的递归效率就低得多了!