一、题目描述和要求
题目描述
给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
示例
示例1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例2:
输入:root = []
输出:[]
示例3:
输入:root = [1]
输出:[1]
提示
- 树中节点数目在范围
[0, 100]
内 -100 <= Node.val <= 100
二、解题思路
总的思路:
对给定的二叉树进行中序遍历,其中空子树用NULL表示,给出根结点root,返回中序遍历结果。对此我们可以采取递归的思想,对二叉树进行遍历,先遍历二叉树的左子树,再输出根结点,最后遍历右子树。此时为了存储中序遍历的结果,首先要申请一个整型数组returnnum用于存储中序遍历结果,由题目提示可知,结点个数在0-100间,对此我们可以申请101个空间,最后一个用于存放结束符。接着判断根结点是否为空,如果为空直接返回NULL,不为空则进入递归遍历函数Traversal,最后返回存储遍历结果的数组returnnum。在Traversal函数中首先要有一个判断结点是否为空的语句,否则对于二叉树的左子树或者右子树为空的结点无法进行处理,而且如果是空结点直接跳过不存入数组,因此return;由于是中序遍历所以先调用函数本身访问左子树,接着将根结点的值存入辅助数组,接着调用函数本身访问右子树,在递归遍历结束之后遍历结果就存到了辅助数组中,函数的参数都是指针的形式,因此是传址,会直接在原本的地址上存储的数据上进行变动。
具体步骤:
1、判断二叉树是否为空树,是则返回NULL
2、对二叉树调用中序递归遍历函数,函数内部对左子树、根的值以及右子树依次进行访问
3、返回存储遍历结果的数组。
注:
遍历二叉树有递归的算法也有非递归算法,除了中序遍历,还有先序和后序遍历,具体算法可以参考:数据结构(C语言版)第六章 树与二叉树_茄味琪琪的博客-CSDN博客
三、具体代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void Traversal(struct TreeNode *root,int *returnnum,int* returnSize)
{
if(root==NULL)
return;
Traversal(root->left,returnnum,returnSize);
returnnum[*returnSize]=root->val;
*returnSize+=1;
Traversal(root->right,returnnum,returnSize);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize){
int* returnnum=(int*)malloc(sizeof(int)*101);
*returnSize=0;
if(root==NULL)
return NULL;
else
{
Traversal(root,returnnum,returnSize);
return returnnum;
}
}