前言
因为个人原因拖了这么久没有更新,接下来争取每天一到两道题来迅速复习数据结构相关内容。
题目描述
给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
示例 1:
输入: root = [1,null,2,3]
输出: [1,3,2]
示例 2:
输入: root = []
输出: []
示例 3:
输入: root = [1]
输出: [1]
分析
- 首先初始化一个res数组,用于记录最后遍历节点的结果,由于题目没有明确说明节点个数,尽可能就将res最初申请的空间分配大以防溢出,通过* res来标记数组。接下来定义returnSize的初始长度为0,表示目前已经遍历的节点个数。
- 然后对二叉树进行递归遍历,声明一个函数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;
}