【算法集训】基础数据结构:八、二叉树

第一题 144. 二叉树的前序遍历

这一题是二叉树的前序遍历:根——左——右
这题需要返回一个数组,所以需要创建一个数组空间,这里重新定义了一个专门进行遍历的函数,如果root不为空的话就使用递归进行操作并把相对应的val值存到数组中去。

/**
 * 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 dopreorderTraversal(struct TreeNode* root, int * ret, int* returnSize) {
    if(root) {
        ret[(*returnSize)++ ] = root->val;
        dopreorderTraversal(root->left, ret, returnSize);
        dopreorderTraversal(root->right, ret, returnSize);
    }
}

int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    int * ret = (int *)malloc(sizeof(int) * 101);
    *returnSize = 0;
    dopreorderTraversal(root, ret, returnSize);
    return ret;
}

第二题 94. 二叉树的中序遍历

/**
 * 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 doinorderTraversal(struct TreeNode* root, int * ret, int* returnSize) {
    if(root) {
        doinorderTraversal(root->left, ret, returnSize);
        ret[(*returnSize)++] = root->val;
        doinorderTraversal(root->right, ret, returnSize);
    }
}

int* inorderTraversal(struct TreeNode* root, int* returnSize) {
    int * ret = (int *)malloc(sizeof(int) * 105);
    *returnSize = 0;
    doinorderTraversal(root, ret, returnSize);
    return ret;
}

第三题 145. 二叉树的后序遍历

/**
 * 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 dopostorderTraversal(struct TreeNode* root,int * ret, int* returnSize) {
    if(root) {
        dopostorderTraversal(root->left, ret, returnSize);
        dopostorderTraversal(root->right, ret, returnSize);
        ret[(*returnSize)++] = root->val;
    }
}

int* postorderTraversal(struct TreeNode* root, int* returnSize) {
    int * ret = (int *)malloc(sizeof(int) * 101);
    *returnSize = 0;
    dopostorderTraversal(root, ret, returnSize);
    return ret;
}

第四题 226. 翻转二叉树

这一题主要是理解二叉树的翻转,最主要的是直接翻转整个节点,而不仅仅是节点,所以需要将指针传递。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

void swap(struct TreeNode ** left, struct TreeNode ** right) {
    struct TreeNode * temp = *left;
    *left = *right;
    *right = temp;
}

struct TreeNode* invertTree(struct TreeNode* root) {
    if(root) {
        swap(&root->left, &root->right);
        invertTree(root->left);
        invertTree(root->right);
    }
    return root;
}

这是之前九日集训的解题方式,这个相对来说简单些,但是理解二叉树还是上面的更好

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
struct TreeNode* invertTree(struct TreeNode* root) {
    if(root == NULL) return NULL;
    struct TreeNode* left = invertTree(root->left);
    struct TreeNode* right = invertTree(root->right);
    root->left = right;
    root->right = left;

    return root;
}
  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子琦啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值