LeetCode //C - 987. Vertical Order Traversal of a Binary Tree

LeetCode //C - 987. Vertical Order Traversal of a Binary Tree

987. Vertical Order Traversal of a Binary Tree

Given the root of a binary tree, calculate the vertical order traversal of the binary tree.

For each node at position (row, col), its left and right children will be at positions (row + 1, col - 1) and (row + 1, col + 1) respectively. The root of the tree is at (0, 0).

The vertical order traversal of a binary tree is a list of top-to-bottom orderings for each column index starting from the leftmost column and ending on the rightmost column. There may be multiple nodes in the same row and same column. In such a case, sort these nodes by their values.

Return the vertical order traversal of the binary tree.
 

Example 1:
在这里插入图片描述
Input: root = [3,9,20,null,null,15,7]
Output: [[9],[3,15],[20],[7]]
Explanation:
Column -1: Only node 9 is in this column.
Column 0: Nodes 3 and 15 are in this column in that order from top to bottom.
Column 1: Only node 20 is in this column.
Column 2: Only node 7 is in this column.
Example 2:
在这里插入图片描述
Input: root = [1,2,3,4,5,6,7]
Output: [[4],[2],[1,5,6],[3],[7]]
Explanation:
Column -2: Only node 4 is in this column.
Column -1: Only node 2 is in this column.
Column 0: Nodes 1, 5, and 6 are in this column.
1 is at the top, so it comes first.
5 and 6 are at the same position (2, 0), so we order them by their value, 5 before 6.
Column 1: Only node 3 is in this column.
Column 2: Only node 7 is in this column.
Example 3:
在这里插入图片描述
Input: root = [1,2,3,4,6,5,7]
Output: [[4],[2],[1,5,6],[3],[7]]
Explanation:
This case is the exact same as example 2, but with nodes 5 and 6 swapped.
Note that the solution remains the same since 5 and 6 are in the same location and should be ordered by their values.
Constraints:
  • The number of nodes in the tree is in the range [1, 1000].
  • 0 <= Node.val <= 1000

From: LeetCode
Link: 987. Vertical Order Traversal of a Binary Tree


Solution:

Ideas:
  • DFS the tree and record each node as (col, row, value) where left = col-1, right = col+1.
  • Sort all records by col, then row, then value (this handles the “same row+col sort by value” rule).
  • Scan the sorted list, group by col, and output each group as one vertical column.
Code:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */typedefstruct{int col;int row;int val;} Trip;typedefstruct{ Trip *a;int sz;int cap;} Vec;staticvoidvec_push(Vec *v,int col,int row,int val){if(v->sz == v->cap){ v->cap =(v->cap ==0)?64: v->cap *2; v->a =(Trip *)realloc(v->a,(size_t)v->cap *sizeof(Trip));} v->a[v->sz++]=(Trip){col, row, val};}staticvoiddfs(structTreeNode*node,int row,int col, Vec *v){if(!node)return;vec_push(v, col, row, node->val);dfs(node->left, row +1, col -1, v);dfs(node->right, row +1, col +1, v);}staticintcmp_trip(constvoid*p1,constvoid*p2){const Trip *a =(const Trip *)p1;const Trip *b =(const Trip *)p2;if(a->col != b->col)return(a->col < b->col)?-1:1;if(a->row != b->row)return(a->row < b->row)?-1:1;if(a->val != b->val)return(a->val < b->val)?-1:1;return0;}/** * Return an array of arrays of size *returnSize. * The sizes of the arrays are returned as *returnColumnSizes array. * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free(). */int**verticalTraversal(structTreeNode* root,int* returnSize,int** returnColumnSizes){*returnSize =0;*returnColumnSizes =NULL;if(!root)returnNULL; Vec v ={0};dfs(root,0,0,&v);qsort(v.a,(size_t)v.sz,sizeof(Trip), cmp_trip);// Count distinct columnsint cols =0;for(int i =0; i < v.sz;){ cols++;int c = v.a[i].col;while(i < v.sz && v.a[i].col == c) i++;}int**res =(int**)malloc((size_t)cols *sizeof(int*));int*colSizes =(int*)malloc((size_t)cols *sizeof(int));// Build result by grouping same columnint idx =0;for(int i =0; i < v.sz;){int c = v.a[i].col;int start = i;while(i < v.sz && v.a[i].col == c) i++;int len = i - start; colSizes[idx]= len; res[idx]=(int*)malloc((size_t)len *sizeof(int));for(int k =0; k < len; k++){ res[idx][k]= v.a[start + k].val;} idx++;}free(v.a);*returnSize = cols;*returnColumnSizes = colSizes;return res;}

Read more

Java中的反射机制详解:从原理到实践的全面剖析

Java中的反射机制详解:从原理到实践的全面剖析

文章目录 * 摘要 * 第一章 反射机制概述 * 1.1 什么是反射? * 1.2 反射的江湖地位:为何需要它? * 1.3 反射的优缺点 * 第二章 反射的基石:Class类与类加载 * 2.1 万物皆对象:Class对象 * 2.2 获取Class对象的三种方式 * 2.3 类加载的幕后故事 * 第三章 解剖类:反射的核心API * 3.1 操作构造方法(Constructor):创建对象 * 3.2 操作字段(Field):访问与修改属性 * 3.3 操作方法(Method):动态调用 * 第四章 深入进阶:反射的高级特性 * 4.1

By Ne0inhk
【AI应用开发工程师】-分享Java 转 AI成功经验

【AI应用开发工程师】-分享Java 转 AI成功经验

Java 转 AI:别再死磕书本了,老司机带你飞! 文章目录 * Java 转 AI:别再死磕书本了,老司机带你飞! * ⭐AI 大模型应用开发全方位成长路线⭐ * 一、Java 老兵的 AI 转型焦虑:书本,你真的跟不上时代了! * 二、AI 导师,你的专属学习外挂! * 三、抱紧大腿,和 AI 大佬一起成长! * 四、拓展方案一:开源社区,你的 AI 练兵场! * 五、拓展方案二:小步快跑,项目实战是王道! * 六、拓展方案三:知识管理,告别“学了就忘”的魔咒! * 七、总结:转型 AI,一场充满乐趣的冒险!

By Ne0inhk
Java 大视界 -- Java+Flink CDC 构建实时数据同步系统:从 MySQL 到 Hive 全增量同步(443)

Java 大视界 -- Java+Flink CDC 构建实时数据同步系统:从 MySQL 到 Hive 全增量同步(443)

Java 大视界 -- Java+Flink CDC 构建实时数据同步系统:从 MySQL 到 Hive 全增量同步(443) * 引言: * 正文: * 一、 核心认知:Flink CDC 与全增量同步逻辑 * 1.1 Flink CDC 核心原理 * 1.1.1 与传统数据同步方案的对比(实战选型参考) * 1.2 全增量同步核心逻辑(MySQL→Hive) * 1.2.1 关键技术点(实战必关注,每个点都踩过坑) * 二、 环境准备:生产级环境配置(可直接复用) * 2.1 核心依赖配置(pom.xml)

By Ne0inhk
【Java 开发日记】为什么要有 time _wait 状态,服务端这个状态过多是什么原因?

【Java 开发日记】为什么要有 time _wait 状态,服务端这个状态过多是什么原因?

目录 为什么要有 TIME_WAIT 状态? 原因一:可靠地终止TCP连接(确保最后的ACK能到达对方) 原因二:让旧连接的重复报文段在网络中自然消失(防止影响新连接) 服务端 TIME_WAIT 状态过多是什么原因? 原因一:服务端使用了短连接,并且是它主动关闭连接 原因二:客户端的非正常行为 原因三:负载均衡器的健康检查 总结 面试回答 为什么要有 TIME_WAIT 状态? TIME_WAIT,俗称2MSL等待状态,是TCP连接主动关闭一方(通常是客户端,但也可能是服务端)在发送最后一次ACK确认报文后,会进入的一个状态。它需要等待2倍的最大报文段生存时间后,才会最终进入CLOSED状态,释放连接资源。 设计TIME_WAIT状态主要有两个核心原因,它们是确保TCP协议可靠性的基石: 原因一:可靠地终止TCP连接(确保最后的ACK能到达对方) 这是最主要的原因。让我们回顾一下TCP四次挥手的正常流程: 1. 主动关闭方(假设为A)

By Ne0inhk