每天一道LeetCode-17(二叉树的中序遍历)

31 阅读1分钟

前言

因为个人原因拖了这么久没有更新,接下来争取每天一到两道题来迅速复习数据结构相关内容。

题目描述

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

输入: root = [1,null,2,3]
输出: [1,3,2]

示例 2:

输入: root = []
输出: []

示例 3:

输入: root = [1]
输出: [1]

分析

  1. 首先初始化一个res数组,用于记录最后遍历节点的结果,由于题目没有明确说明节点个数,尽可能就将res最初申请的空间分配大以防溢出,通过* res来标记数组。接下来定义returnSize的初始长度为0,表示目前已经遍历的节点个数。
  2. 然后对二叉树进行递归遍历,声明一个函数inorder,首先判断传入的根节点是否合法,否则返回;再进行递归调用,由于是中序遍历,采用左-根-右的顺序,于是我们首先调用inorder中传入的参数应该是当前节点的左孩子,即root->left,然后将当前节点的val保存至res中,然后* returnSize++,再调用inorder递归右孩子。

代码实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

//inoder的参数:遍历的节点,返回的结果,当前已经遍历的节点数
void inorder(struct TreeNode* root,int* res,int* resSize){
    if(!root){
        return;
    }
    inorder(root->left,res,resSize);
    visit(root,res,resSize);
    inorder(root->right,res,resSize);
}

//需要对节点进行的操作:将节点的值保存在res中
void visit(struct TreeNode* p,int* res,int* resSize){
    res[(*resSize)++] = p->val;
}

int* inorderTraversal(struct TreeNode* root, int* returnSize){
    int* res = malloc(sizeof (int) * 501);
    int* returnSize = 0;
    inorder(root,res,returnSize);
    return res;
}