递归实现二叉树的前序遍历

本文详细介绍了如何使用递归方法解决二叉树的前序遍历问题,包括C++和Python两种语言的代码实现。通过递归思路,首先输出根节点值,再分别遍历左子树和右子树,最终得到前序遍历序列。示例展示了具体的操作过程,并给出了对应的LeetCode题目链接。
摘要由CSDN通过智能技术生成

二叉树的前序遍历

题目

(1)给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
(2)示例如下:
在这里插入图片描述
输入:root = [1,null,2,3]
输出:[1,2,3]

解决思路

  • 采用递归思想解决。
  • 二叉树前序遍历的顺序是:根节点 --> 左节点 --> 右节点。
  • 具体步骤:
    • 第一步:输出根节点的值。
    • 第二步:递归遍历左子树。
    • 第三步:递归遍历右子树。

代码

  • C++代码
# include <stdio.h>
# include <vector>

using namespace std;

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(): val(0), left(nullptr), right(nullptr) {}
    TreeNode(int val): val(val), left(nullptr), right(nullptr) {}
    TreeNode(int val, TreeNode* left, TreeNode* right): val(val), left(left), right(right) {}
};


class Solution {
public:
    // 前序遍历:将当前根节点的值放入answer数组末尾,然后递归遍历左右节点。
    void mypreorder(TreeNode* root, vector<int>& answer) {
        if (nullptr == root) {
            return;
        }
        answer.push_back(root->val);        // 第一步:输出根节点的值。
        mypreorder(root->left, answer);     // 第二步:递归遍历左子树。
        mypreorder(root->right, answer);    // 第三步:递归遍历右子树。
    }

    vector<int> preorderTraversal(TreeNode* root) {
        if (NULL == root) {
            return vector<int> ();
        }
        vector<int> answer;
        mypreorder(root, answer);
        return answer;
    }
};

int main() {
    TreeNode* n1 = new TreeNode(1);
    TreeNode* n2 = new TreeNode(2);
    TreeNode* n3 = new TreeNode(3);

    n1->left = nullptr;
    n1->right = n2;
    n2->left = n3;
    n2->right = nullptr;
    n3->left = nullptr;
    n3->right = nullptr;

    TreeNode* root = n1;
    Solution *solution = new Solution();
    vector<int> ret = solution->preorderTraversal(root);
    for (auto x : ret) {
        printf("%d  ", x);
    }
    printf("\n");
    return 0;
}
  • Python代码
# -*- coding: utf-8 -*-

from typing import List, Optional


class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def __init__(self):
        pass

    # 前序遍历:将当前根节点的值放入answer数组末尾,然后递归遍历左右节点。
    def mypreorder(self, root: Optional[TreeNode], answer: List[int]):
        if None == root:
            return

        answer.append(root.val)             # 第一步:输出根节点的值。
        self.mypreorder(root.left, answer)  # 第二步:递归遍历左子树。
        self.mypreorder(root.right, answer) #  第三步:递归遍历右子树。

    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        answer: List[int] = []
        self.mypreorder(root, answer)
        return answer


def main():
    n1 = TreeNode(1)
    n2 = TreeNode(2)
    n3 = TreeNode(3)

    n1.left = None
    n1.right = n2
    n2.left = n3
    n2.right = None
    n3.left = None
    n3.right = None

    root: TreeNode = n1
    solution = Solution()
    ret = solution.preorderTraversal(root)
    print(ret)


if __name__ == "__main__":
    main()

说明

  • 对应LeetCode第144题。
  • 链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值