From 35ac776a7d8769ff2c13c0c233e20bdff52addb2 Mon Sep 17 00:00:00 2001 From: wjchahaha <1678912421@qq.com> Date: Tue, 9 Aug 2022 19:04:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9ACM=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E4=B8=8B=E5=A6=82=E4=BD=95=E6=9E=84=E5=BB=BA=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91BUG,=E4=BF=AE=E6=94=B9java&C++=E4=BB=A3=E7=A0=81.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../前序/ACM模式如何构建二叉树.md | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/problems/前序/ACM模式如何构建二叉树.md b/problems/前序/ACM模式如何构建二叉树.md index f2aafed6..01d5b255 100644 --- a/problems/前序/ACM模式如何构建二叉树.md +++ b/problems/前序/ACM模式如何构建二叉树.md @@ -57,11 +57,18 @@ TreeNode* construct_binary_tree(const vector& vec) { if (i == 0) root = node; } // 遍历一遍,根据规则左右孩子赋值就可以了 - // 注意这里 结束规则是 i * 2 + 2 < vec.size(),避免空指针 - for (int i = 0; i * 2 + 2 < vec.size(); i++) { + // 注意这里 结束规则是 i * 2 + 1 < vec.size(),避免空指针 + // 为什么结束规则不能是i * 2 + 2 < arr.length呢? + // 如果i * 2 + 2 < arr.length 是结束条件 + // 那么i * 2 + 1这个符合条件的节点就被忽略掉了 + // 例如[2,7,9,-1,1,9,6,-1,-1,10] 这样的一个二叉树,最后的10就会被忽略掉 + // 遍历一遍,根据规则左右孩子赋值就可以了 + + for (int i = 0; i * 2 + 1 < vec.size(); i++) { if (vecTree[i] != NULL) { // 线性存储转连式存储关键逻辑 vecTree[i]->left = vecTree[i * 2 + 1]; + if(i * 2 + 2 < vec.size()) vecTree[i]->right = vecTree[i * 2 + 2]; } } @@ -114,9 +121,10 @@ TreeNode* construct_binary_tree(const vector& vec) { vecTree[i] = node; if (i == 0) root = node; } - for (int i = 0; i * 2 + 2 < vec.size(); i++) { + for (int i = 0; i * 2 + 1 < vec.size(); i++) { if (vecTree[i] != NULL) { vecTree[i]->left = vecTree[i * 2 + 1]; + if(i * 2 + 2 < vec.size()) vecTree[i]->right = vecTree[i * 2 + 2]; } } @@ -213,7 +221,7 @@ public class Solution { static class TreeNode { // 节点值 int val; - + // 左节点 TreeNode left; @@ -249,12 +257,18 @@ public class Solution { } } // 遍历一遍,根据规则左右孩子赋值就可以了 - // 注意这里 结束规则是 i * 2 + 2 < arr.length,避免空指针 - for (int i = 0; i * 2 + 2 < arr.length; i++) { + // 注意这里 结束规则是 i * 2 + 1 < arr.length,避免空指针 + // 为什么结束规则不能是i * 2 + 2 < arr.length呢? + // 如果i * 2 + 2 < arr.length 是结束条件 + // 那么i * 2 + 1这个符合条件的节点就被忽略掉了 + // 例如[2,7,9,-1,1,9,6,-1,-1,10] 这样的一个二叉树,最后的10就会被忽略掉 + for (int i = 0; i * 2 + 1 < arr.length; i++) { TreeNode node = treeNodeList.get(i); if (node != null) { // 线性存储转连式存储关键逻辑 node.left = treeNodeList.get(2 * i + 1); + // 再次判断下 不忽略任何一个节点 + if(i * 2 + 2 < arr.length) node.right = treeNodeList.get(2 * i + 2); } }