首页 新闻 会员 周边 捐助

数组存储二叉树节点

0
[已关闭问题] 关闭于 2025-09-13 14:55

6种形态:

满二叉树和完全二叉树:

完全二叉树:

最后一层叶子节点可以为空,并且叶子必须靠左排列

_java_python的主页 _java_python | 小虾三级 | 园豆:984
提问于:2025-09-13 14:24
< >
分享
所有回答(1)
0
在数据结构中,“节点”只是一个逻辑单位:

节点 = 数据域(值) + 关系域(指针/下标)

它既不是“内存块”本身,也不是“地址”本身,而是我们想象出来的一个打包概念。
指针式(传统写法)
struct Node {          // 我们口中的“节点对象”
    int  val;          // 数据域
    Node* left;        // 关系域:两个指针
    Node* right;
};
每 new 一个 Node,就在堆里拿到一块散落的内存, left/right 里填的是真正的内存地址。

数组式(拍扁写法)
int tree[MAXN];        // 只存数据,不存指针
所谓“节点”此时被压缩成一个整数(或其他 POD 类型),整棵树只占一段连续 int。
父子关系不再用地址,而是用下标公式:
leftIdx  = 2*i + 1
rightIdx = 2*i + 2
因此数组里的每个元素依旧代表“一个节点”,只是它的“关系”被隐含在公式里,而不再显式存储。
同一批数据 {3,1,4},两种做法在内存里的样子:
指针式(散落在堆中,箭头代表地址)
[addr 0xA] val=3, left=0xB, right=0xC
[addr 0xB] val=1, left=null,right=null
[addr 0xC] val=4, left=null,right=null
数组式(连续占用 3 个 int)

int t[3] = {3,1,4}; // 下标 0 是根,1 是左,2 是右

二叉树一般采用链式存储

 
想访问根节点的右孩子,直接 t[2*0+2] = t[2] = 4,无需解引用任何指针。
_java_python | 园豆:984 (小虾三级) | 2025-09-13 14:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册