二叉树的存储结构
顺序存储
#define MaxSize 100
struct TreeNode{ElemType value; //结点中的数据元素bool isEmpty; //结点元素是否为空
};//定义一个长度为MaxSize的数组t,按照从上至下、从左至右的顺序依次完成存储完全二叉树中的各个节点
TreeNode t[MaxSize];
for (int i = 0;i<MaxSize;i++){t[i].isEmpty = true; //初始化所有结点为空
}
几个重要常考的基本操作:
i 的左孩子 – 2i
i 的右孩子 – 2i+1
i 的父节点 – [i/2]
i 所在的层次 – [log2(n+1)]或[log2n]+1
【注意】如果是一颗普通的二叉树,依然按照层序将各节点顺序存储,那么结点间是没有上述的对应关系的
⭐所以在二叉树的顺序存储中,一定需要将二叉树的节点编号与完全二叉树对应起来
【存在问题】在最坏情况下,高度为h的且只有h个节点的单只树(所有结点只有右孩子),也至少需要2^h-1个存储单元
链式存储
//二叉树的结点(链式存储)
typedef struct BiTNode{ElemType data; //数据域struct BiTNode * lchild,*rchild; //左右孩子
}BiTNode,*BiTree;
⭐n个结点的二叉链表共有n+1个空链域(可以用于构造线索二叉树)
struct ElemType{int value;
};typedef struct BiTNode{ElemType data; //数据域struct BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;//定义一颗空树
BiTree root = NULL://插入根结点
root = (BiTree)malloc(sizeof(BiTNode));
root->data = {1};
root->lchild = NULL;
root->rchild = NULL;//插入新结点
BiTNode *p = (BiTNode*)malloc(sizeof(BiTNode));
p->data = {2};
p->lchild = NULL;
p->rchild = NULL;
root ->lchild = p; //作为根结点的左孩子
找到指定结点p的左右孩子 – p->lchild; p->rchild;
找到指定结点p的父节点 – 只能从根节点开始遍历
【解决】如果经常需要寻找父节点,可以使用三叉链表(添加一个父结点指针)
//二叉树的结点(链式存储)
typedef struct BiTNode{ElemType data; //数据域struct BiTNode *lchild,*rchild; //左右孩子指针struct BiTNode *parent; //父结点指针(根据实际需要决定要不要添加)
}BiTNode,*BiTree;