题目描述:
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
输出: [1,3,2]
- 递归法
设置树的数组以及整数数组,以树的长度为数组长度。并且进行中序遍历,将中序遍历得到的数输入数组,并且把得到的数输出。
void inorder(struct TreeNode *root, int *returnSize, int *res)
{ //中序遍历函数
if(!root)
{
return;
}
inorder(root->left,returnSize,res);
res[(*returnSize)++] = root->val;
inorder(root->right, returnSize,res);
}
int nodeNum(struct TreeNode *root)//返回树的各子树总长度
{
if(!root)
return 0;
return nodeNum(root->left)+nodeNum(root->right)+1;
}
int* inorderTraversal(struct TreeNode* root, int* returnSize)
{
//检查
if(!root)
{
*returnSize = 0;
return NULL;
}
int len = nodeNum(root); //返回树的长度
int *result = (int*)malloc(sizeof(int)*len);
memset(result,0,sizeof(int)*len);//设置空数组
*returnSize = 0;
inorder(root, returnSize, result);
return result;
}
- 迭代法
设置栈表进行排序,首先设置树的长度为链表的长度和数组的长度。首先取最左的节点,将值放入数组中,之后将该节点的母节点的值,放入数组,再取右节点进行遍历。不断迭代,直到节点为零。
/**
* 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().
*/
int nodeNum(struct TreeNode *root)
{
if(!root)
{
return 0;
}
return nodeNum(root->left)+nodeNum(root->right)+1;
}//计算树的长度
int* inorderTraversal(struct TreeNode* root, int* returnSize){
if(!root){
*returnSize=0;
return NULL;
}
int len=nodeNum(root);
struct TreeNode **temp=(struct TreeNode**)malloc(sizeof(struct TreeNode*)*len*2);
int *result=(int*)malloc(sizeof(int)*len);
temp[0]=root;
int i=0,top=0;
while(1)
{
while(temp[top]!=NULL)
temp[++top]=temp[top]->left;//取当前最左的节点
top--;
if(top!=-1)
{
result[i++]=temp[top]->val;
temp[top]=temp[top]->right;
}
else
break; //没有节点之后输出
}
*returnSize=i;
return result;
}
运行结果: