首页 > 编程语言 >代码随想录算法训练营第十二天|Day12二叉树

代码随想录算法训练营第十二天|Day12二叉树

时间:2024-10-12 20:20:21浏览次数:11  
标签:node 第十二天 returnSize int 随想录 ret 二叉树 TreeNode root

递归遍历 

题目链接/文章讲解/视频讲解:https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86.html

思路

每次写递归,按照三要素来写,可以写出正确的递归算法!

  1. 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。

  2. 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。

  3. 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

void preOrder(struct TreeNode* root, int* ret, int* returnSize) {
    if(root == NULL)
        return;
    ret[(*returnSize)++] = root->val;
    preOrder(root->left, ret, returnSize);
    preOrder(root->right, ret, returnSize);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
    int* ret = (int*)malloc(sizeof(int) * 100);
    *returnSize = 0;
    preOrder(root, ret, returnSize);
    return ret;
}
void inOrder(struct TreeNode* node, int* ret, int* returnSize) {
    if(!node)
        return;
    inOrder(node->left, ret, returnSize);
    ret[(*returnSize)++] = node->val;
    inOrder(node->right, ret, returnSize);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize){
    int* ret = (int*)malloc(sizeof(int) * 100);
    *returnSize = 0;
    inOrder(root, ret, returnSize);
    return ret;
}
void postOrder(struct TreeNode* node, int* ret, int* returnSize) {
    if(node == NULL) 
        return;
    postOrder(node->left, ret, returnSize);
    postOrder(node->right, ret, returnSize);
    ret[(*returnSize)++] = node->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize){
    int* ret= (int*)malloc(sizeof(int) * 100);
    *returnSize = 0;
    postOrder(root, ret, returnSize);
    return ret;
}

学习反思 

之前写递归的时候总是有问题,用这三步之后感觉清晰了很多

迭代遍历

题目链接/文章讲解/视频讲解:https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8%BF%AD%E4%BB%A3%E9%81%8D%E5%8E%86.html

思路

typedef struct TreeNode {  
    int val;  
    struct TreeNode *left;  
    struct TreeNode *right;  
} TreeNode;  
TreeNode* createNode(int val) {  
    TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));  
    newNode->val = val;  
    newNode->left = NULL;  
    newNode->right = NULL;  
    return newNode;  
}    
void postorderTraversal(TreeNode* root, int* result, int* returnSize) {  
    TreeNode* stack[1000];
    int top = -1; 
    int index = 0; 
  
    if (root == NULL) {  
        *returnSize = 0;  
        return;  
    }    
    stack[++top] = root;  
    while (top != -1) {  
        TreeNode* node = stack[top--];  
        result[index++] = node->val;  
        if (node->right) {  
            stack[++top] = node->right;  
        }  
        if (node->left) {  
            stack[++top] = node->left;  
        }  
    }  
    for (int i = 0; i < index / 2; i++) {  
        int temp = result[i];  
        result[i] = result[index - i - 1];  
        result[index - i - 1] = temp;  
    }    
    *returnSize = index;  
}  

学习反思 

感觉有些困难,需要多理解。

层序遍历

题目链接/文章讲解/视频讲解:https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html

思路

 typedef struct TreeNode {  
    int val;  
    struct TreeNode *left;  
    struct TreeNode *right;  
} TreeNode;   
typedef struct QueueNode {  
    TreeNode *treeNode;  
    struct QueueNode *next;  
} QueueNode;   
typedef struct Queue {  
    QueueNode *front;  
    QueueNode *rear;  
} Queue;   
Queue* createQueue() {  
    Queue *q = (Queue*)malloc(sizeof(Queue));  
    q->front = q->rear = NULL;  
    return q;  
}   
void enqueue(Queue *q, TreeNode *node) {  
    QueueNode *newNode = (QueueNode*)malloc(sizeof(QueueNode));  
    newNode->treeNode = node;  
    newNode->next = NULL;  
    if (q->rear == NULL) {  
        q->front = q->rear = newNode;  
    } else {  
        q->rear->next = newNode;  
        q->rear = newNode;  
    }  
}      
TreeNode* dequeue(Queue *q) {  
    if (q->front == NULL) return NULL;  
    QueueNode *temp = q->front;  
    TreeNode *node = temp->treeNode;  
    q->front = q->front->next;  
    if (q->front == NULL) q->rear = NULL;  
    free(temp);  
    return node;  
}  
int isEmpty(Queue *q) {  
    return q->front == NULL;  
}  
int** levelOrder(TreeNode* root, int* returnSize, int** returnColumnSizes) {  
    Queue *que = createQueue();  
    if (root != NULL) enqueue(que, root);   
    int **result = NULL;  
    *returnColumnSizes = NULL;  
    *returnSize = 0;  
    while (!isEmpty(que)) {  
        int size = isEmpty(que) ? 0 : 1; 
        QueueNode *current = que->front;   
        while (current->next != NULL) {  
            size++;  
            current = current->next;  
        }  
        result = (int**)realloc(result, (*returnSize + 1) * sizeof(int*));  
        result[*returnSize] = (int*)malloc(size * sizeof(int));  
        (*returnColumnSizes) = (int*)realloc((*returnColumnSizes), (*returnSize + 1) * sizeof(int));  
        (*returnColumnSizes)[*returnSize] = size;  
        for (int i = 0; i < size; i++) {  
            TreeNode *node = dequeue(que);  
            result[*returnSize][i] = node->val;  
            if (node->left) enqueue(que, node->left);  
            if (node->right) enqueue(que, node->right);  
        }  
        (*returnSize)++;  
    }    
    return result;  
}  

学习反思

感觉有些困难,需要多理解。

总结

对二叉树和递归有了深刻认识,加油!!!

标签:node,第十二天,returnSize,int,随想录,ret,二叉树,TreeNode,root
From: https://blog.csdn.net/a6666999d/article/details/142860901

相关文章

  • 代码随想录算法训练营第十一天|Day11栈与队列
    150.逆波兰表达式求值题目链接/文章讲解/视频讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html思路#defineMAX_TOKENS1000#defineMAX_TOKEN_LEN10typedefstruct{longlongdat......
  • 代码随想录算法训练营第十三天|Day13二叉树
    226.翻转二叉树题目链接/文章讲解/视频讲解:https://programmercarl.com/0226.%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.html思路只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果递归法structTreeNode*invertTree(structTreeNode*root){if(!......
  • 递归——二叉树中的深搜
    文章目录计算布尔二叉树的值求根节点到叶节点数字之和二叉树剪枝验证二叉搜索树二叉搜索树中第K小的元素二叉树的所有路径二叉树中的深搜有三种方法前序遍历根->左子树->右子树中序遍历左子树->根->右子树前序遍历左子树->右子树->根计算布尔二叉树的值......
  • 代码随想录训练营第五天|Leetcode.349,Leetcode.454,Leetcode19,Leetcode18
    一、哈希表和set和map和数组的关系 用哈希表,判断是否出现过。数值很大或者数值很分散时,不用数组,占用空间大,用set。set,multiset数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判......
  • 二叉树(上)
    目录1.树型结构(了解)1.1树形结构概念1.2树概念(重要)​编辑1.3树的表示形式(了解)1.4树的应用​编辑2.二叉树(重点)2.1概念2.2两种特殊的二叉树2.3二叉树的性质2.4二叉树的存储2.5二叉树的基本操作2.5.1前置说明1.树型结构(了解)1.1树形结构概念树......
  • 代码随想录训练营第60天|冗余连接
    108.冗余连接#include<iostream>#include<vector>usingnamespacestd;intn;//节点数量vector<int>father(1001,0);//按照节点大小范围定义数组//并查集初始化voidinit(){for(inti=0;i<=n;++i){father[i]=i;}}//并查集......
  • 代码随想录算法训练营day12|144.二叉树的前序遍历 94.二叉树的中序遍历 145.二叉
    学习资料:https://programmercarl.com/二叉树理论基础.html二叉树:满二叉树、完全二叉树、二叉搜索数、平衡二叉搜索树;链式存储、顺序存储;前序/中序/后序遍历递归法、迭代法,层序深度优先搜索dfs,广度优先搜索学习记录:144.二叉树的前序遍历(也要注重二叉数的输入方式;递归法比迭......
  • 代码随想录Day23 | LeetCode 455. 分发饼干、LeetCode 53. 最大子数组和、LeetCode 37
    LeetCode455.分发饼干贪心就是干classSolution:deffindContentChildren(self,g:List[int],s:List[int])->int:g.sort(reverse=True)s.sort(reverse=True)i=j=0res=0whilei<len(g)andj<len(......
  • 代码随想录算法训练营 | 完全背包,518. 零钱兑换 II,377. 组合总和 Ⅳ,70. 爬楼梯 (进阶)
    完全背包题目链接:完全背包文档讲解︰代码随想录(programmercarl.com)视频讲解︰完全背包日期:2024-10-11想法:dp数组设置思路跟01背包一样,不同在遍历上,完全背包遍历背包大小是从weight[i]开始的(背包空间小于weight[i]就没有意义,不用考虑,直接用之前的对应数值就行了),从前往后遍历就能......
  • 【hot100-java】二叉树的右视图
    二叉树篇tql /***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=val;}*TreeNode(intval,TreeNodeleft,Tre......