代码随想录刷题-Day14-二叉树

代码随想录刷题-Day14-二叉树

二叉树的定义

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

二叉树的定义和链表差不多,不同的是二叉树多了一个指针,两个指针分别指向左右孩子。

二叉树的递归遍历

递归三要素:

  • 确定递归的参数和返回值
  • 确定终止条件
  • 确定单层递归的逻辑:确定每一层递归需要处理的信息

leetcode-144.二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
代码随想录刷题-Day14-二叉树_第1张图片

前序遍历:对节点的处理工作是在它的诸儿子节点后被处理之前进行的。
1、确定递归的参数和返回值:返回值直接返回NULL,因为要打印出前序遍历节点的所有数值,所以参数里需要放入vector来存放节点的数值。

void trversal(NodeTree *cur, vector<int> vector)

2、确定终止条件:当前遍历的节点为空的时候本层递归结束。

if(cur == NULL) return;

3、确定单层递归逻辑:前序遍历中是中左右的顺序

vec.push_back(cur->val);
trversal(cur->left, vector);
trversal(cur->right, vector);

题目解法:

void trversal(struct TreeNode *cur, int *ret, int *returnSize){
    if(cur==NULL)
        return;
    ret[(*returnSize)++] = cur->val;
    trversal(cur->left, ret, returnSize);
    trversal(cur->right, ret, returnSize);
}

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

递归遍历的思想很简单,先对传进来的树节点判断是否为空,否则作下一步处理,先将当前节点的值存到要返回的介质,在用递归函数递归左节点最后再处理右节点。
其中存储介质的做法需特别注意,函数传入一个int指针int *returnSize指明要返回的数组的大小。
在主函数中,先为返回函数申请一个极限大的数组,将returnSize赋初值为0,在递归函数中传入二者,作一下处理

ret[(*returnSize)++]=cur->val;

这样,节点的值就被存储在了数组当前下标中,且指示数组大小的值相应加1,下标也加1.

leetcode-145.二叉树的后序遍历

前序遍历的思想是中左右
中序遍历的思想是左中右
后序遍历的思想是左右中

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。
代码随想录刷题-Day14-二叉树_第2张图片

void trversal(struct TreeNode *cur, int* ret, int* returnSize){
    if(cur==NULL)
        return;
    trversal(cur->left, ret, returnSize);
    trversal(cur->right, ret, returnSize);
    ret[(*returnSize)++]=cur->val;
}

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

你可能感兴趣的:(算法,数据结构,leetcode)