给定一个二叉树的根节点 root
,返回它的 中序 遍历。
递归实现
void inorder(struct TreeNode*root,int* res, int *resSize){
if(!root){
return ;
}
inorder(root->left,res,resSize);//递去递归遍历左子树
res[(*resSize)++]=root->val; // 归来加加 为根
inorder(root->right,res,resSize);//再递归右子树
}
int Treesize(struct TreeNode* root)//递归 得到树中元素个数
{
if(!root)
return 0;
return Treesize(root->right)+Treesize(root->left)+1;
}
int* inorderTraversal(struct TreeNode* root, int* returnSize){
int size =Treesize(root);
int* res = malloc(sizeof(int)*size);
*returnSize = 0;
inorder(root,res,returnSize);
return res;
}
迭代实现
int TreeSize(struct TreeNode* root)
{
if(!root) return 0;
return TreeSize(root->left)+TreeSize(root->right)+1;
}
int* inorderTraversal(struct TreeNode* root, int* returnSize){
int size=TreeSize(root);
int p=-1,index=0;
if(!root){
*returnSize=0;
return NULL;
}
struct TreeNode** src=malloc(sizeof(struct TreeNode*)*size);
int *res=malloc(sizeof(int)*size);
while(root!=NULL||p!=-1)
{
while(root) //为空时 走到最左边的左子树
{
src[++p]=root;//存储根信息
root=root->left;//一直往左走
}
if(p!=-1)//检查当前节点的右子树是否遍历 -1表示已遍历
{
root=src[p--]; // p--找到第一个左
res[index++]=root->val;//保存第一个左
root=root->right;
}
}
*returnSize =index;
return res;
}