LeetCode 刷题 [C++] 第144题. 二叉树的前序遍历 (递归与迭代)

题目描述

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
示例 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

递归思路

先树根,然后左子树,然后右子树。每棵子树递归。
解题步骤:
1.先将根节点值放入容器;
2.接着将左子树的节点值放入容器;
3.再将右子树的节点值放入容器
具体代码实现:

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        if(!root) return preVec;
        preVec.emplace_back(root->val); //先将根节点值放入容器
        preorderTraversal(root->left); //接着将左子树的节点值放入容器
        preorderTraversal(root->right);//再将右子树的节点值放入容器
        return preVec;
    }
private:
    vector<int> preVec;
};

迭代算法思路

由于每棵子树都先访问其根节点。对节点的左右子树来说,也一定是先访问根。因此,每到一个节点Node,就应该立即访问它本身。
又因为在Node的两棵子树中,遍历完左子树后,再遍历右子树。因此,在访问完根节点后,遍历左子树前,要将右子树压入栈。
解题步骤:
1.先将节点本身的值放入容器;
2.接着将右子节点放入栈中;
3.接着遍历左子树节点,即更新左子树节点为当前节点;
4.当左子树遍历到叶节点后,开始异栈顶元素为当前元素,并弹出该栈顶元素(右节点);
5.若栈中弹出的元素非空,则执行1~4;若为空,则不进行任何处理,继续弹出栈顶元素;
6.直至站内元素和当前元素为空,此时,返回容器。
具体代码实现:

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        if(!root) return {};
        stack<TreeNode* > preStk;
        vector<int> preVec;
        TreeNode* current = root;
        while(current || preStk.size()) {
            while(current) {
		preVec.emplace_back(current->val);
                preStk.push(current->right);
                current = current->left;
            }
            current = preStk.top();
            preStk.pop();
        }
        return preVec;
    }
};

AC结果

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值