Mã nguồn - mua the game w88 o dau
]( "Giới thiệu bài toán") Giới thiệu bài toán
Một đường đi trong cây nhị phân được định nghĩa là một dãy các nút sao cho mỗi cặp nút kề nhau trong dãy đều có một cạnh nối chúng lại. Một nút chỉ có thể xuất hiện trong dãy chỉ tối đa một lần. Lưu ý rằng đường đi này không bắt buộc phải đi qua gốc của cây.
Tổng đường đi của một đường đi là tổng giá trị của tất cả các nút nằm trên đường đi đó.
Cho trước gốc
của một cây nhị phân, hãy tìm và trả về tổng đường đi lớn nhất từ bất kỳ đường đi nào trong cây.
Một đường đi được xác định là một chuỗi bắt đầu từ bất kỳ nút nào trong cây, di chuyển theo mối liên kết giữa nút cha và nút con để đến bất kỳ nút nào khác. Đường đi này phải chứa ít nhất một nút, và không cần thiết phải đi qua nút gốc.
Tổng đường đi chính là tổng giá trị của tất cả các nút nằm trên đường đi.
Bạn sẽ nhận vào gốc của một cây nhị phân root
, nhiệm vụ là tìm và trả về tổng đường đi lớn nhất.
[Phân tích ngắn gọn]
Thực tế thì bài toán này dễ bị hiểu sai thành việc chỉ cần tìm tổng lớn nhất ở cây con trái hoặc cây con phải, hoặc đơn giản là cộng cả hai lại. Tuy nhiên, khi suy nghĩ kỹ hơn, bạn sẽ nhận ra rằng tổng lớn nhất hoàn toàn có thể xuất phát từ bất kỳ đâu trong cây con trái hoặc cây con phải, và không nhất thiết phải liên quan đến gốc của từng cây con. Điều này có vẻ khó hiểu nếu chỉ diễn đạt bằng lời, vì vậy việc vẽ hình minh họa sẽ giúp ích rất nhiều.
[Mã nguồn]
1public class TreeNode {
2 int val;
3 TreeNode left;
4 TreeNode right;
5 TreeNode() {}
6 TreeNode(int val) { this.val = val; }
7 TreeNode(int val, TreeNode left, TreeNode right) {
8 this.val = val;
9 this.left = left;
10 this.right = right;
11 }
12}
13
14class Solution {
15 int ansNew = Integer.MIN_VALUE;
16
17 public int maxPathSum(TreeNode root) {
18 maxSumNew(root);
19 return ansNew;
20 }
21
22 public int maxSumNew(TreeNode root) {
23 if (root == null) {
24 return 0;
25 }
26
27 // Sử dụng đệ quy để tính tổng đường đi lớn nhất của cây con trái và cây con phải
28 int left = Math.max(maxSumNew(root.left), 0);
29 int right = Math.max(maxSumNew(root.right), 0);
30
31 // Tổng đường đi lớn nhất tại nút hiện tại
32 int currentSum = root.val + left + right;
33
34 // Cập nhật giá trị lớn nhất toàn cục
35 ansNew = Math.max(ansNew, [bong da [888bets](/post/ffad3a1d095ed7c7.html) doi thuong bang the cao](/post/bab1ff1d1435b774.html) currentSum);
36
37 // Trả về tổng lớn nhất có thể tạo thành khi đi qua nút hiện tại
38 return root.val + Math.max(left, right);
39 }
40}