二叉树数组表示合法性疑问:节点8的父节点为何为null?
给定输入数组:[37,-34,-48,null,-100,-101,48,null,null,null,null,-54,null,-71,-22,null,null,null,8]
根据该数组构建的二叉树结构如下:
37 -> L : -34, R: -48 -34 -> L : null, R: -100 -48 -> L: -101, R: 48 -100: L: null, R: null -101-> L: null, R: null 48 -> L: -54, R: null -54: L: -71, R: -22 -71 -> L: null, R: null -22 -> L: null, R: 8 8 -> L: null, R: null
(L代表左子节点,R代表右子节点)
核心疑问
按照完全二叉树的数组存储规则:节点i的左子节点在索引2i+1,右子节点在2i+2;反之,子节点j的父节点索引为int((j-1)/2)。但数组中索引18的节点8,按此计算父节点是索引8(值为null),为何这棵树依然有效?
参考资料:伯克利CS61BL课程中关于二叉树数组表示的内容——该内容指出,完全二叉树可通过紧凑数组存储,索引规则严格成立;但非完全二叉树常采用层序遍历的精简表示,这种方式不严格遵循完全二叉树的索引规则,仅按层序遍历顺序记录节点,用null占位表示当前位置无节点。
你混淆了两种完全不同的二叉树数组表示方式:
完全二叉树的紧凑存储规则
你提到的节点i的子节点在2i+1/2i+2是完全二叉树的专用存储方式,这种场景下数组里的每个元素都对应完全二叉树的一个位置,null仅代表该位置确实没有节点,子节点的索引计算绝对严格。题目采用的是层序遍历的精简表示
题目给出的数组是层序遍历的结果,仅保留有效节点和必要的占位null:从根节点开始,按层序顺序依次处理每个节点,遇到非null节点就依次为其分配左、右子节点(对应数组的下一个/下下个元素);如果某个节点的左/右子节点不存在,就用null占位,但后续节点的位置是按遍历顺序排列,而非套用完全二叉树的索引公式。
拿节点8来说:它是-22的右子节点,-22是-54的右子节点,-54是48的左子节点,48是-48的右子节点——这是层序遍历到-22时,记录其右子节点为8,所以8出现在数组的对应位置,和完全二叉树的索引规则没有关系。
- 关于树的有效性
你构建的二叉树是完全有效的,因为它严格遵循了层序遍历数组的解析逻辑:按顺序为每个非null节点匹配左、右子节点,数组中的元素依次对应层序遍历的节点序列,null仅表示当前位置无节点,不影响后续节点的归属——后续节点必然属于前面某个非null节点的子节点,按遍历顺序匹配即可。
内容的提问来源于stack exchange,提问作者Ayush Singh Bhadoria

