欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【leetcode】中序遍历二叉树

程序员文章站 2022-05-19 21:03:05
...

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

示例:

输入: [1,null,2,3]
   1
    \
     2
    /
   3

输出: [1,3,2]

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

解题思路:

先用递归的思路写一个代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* inorderTraversal(struct TreeNode* root, int* returnSize) {
    if(root==NULL)//如果根节点为空,那么返回数组为空
    {
        return NULL;
    }
    int leftLen=0,rightLen=0;//分别表示左子树的节点数和右子数的节点数
    int *leftArr=inorderTraversal(root->left,&leftLen);//递归遍历左子树,返回左子树的节点值数组leftArr及其长度leftLen
    int *rightArr=inorderTraversal(root->right,&rightLen);//递归遍历右子树,返回右子树的节点值数组rightArr及其长度rightLen
    *returnSize=leftLen+rightLen+1;//树的全部节点数
    int *arr=(int *)malloc(sizeof(int)*(*returnSize));//存放树的所有节点的val数组
    int i=0,j=0;
    for(i=0;i<leftLen;i++)//左子树的全部节点的val加到返回数组中
    {
        arr[i]=leftArr[i];
    }
    arr[leftLen]=root->val;//根节点的val加到返回数组中
    for(j=0;j<rightLen;j++)//右子数的全部节点的val加到返回数组中
    {
        arr[j+leftLen+1]=rightArr[j];
    }
    free(leftArr);//释放左子树val数组动态分配的空间
    free(rightArr);//释放右子数val数据动态分配的空间
        
    return arr;
}