版权声明:本文为博主原创文章,转载请附明出处^_^ https://blog.csdn.net/cprimesplus/article/details/89574924
二叉树的顺序存储
一、完全二叉树与满二叉树
结点 | A | B | C | D | E | F | G |
---|---|---|---|---|---|---|---|
下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
通过层次顺序对这棵树的结点进行编号,由于每个父亲结点下对应两个孩子结点,因此对应的两个孩子结点的下标分别是: 和
二、非完全二叉树
结点 | A | B | # | D | E |
---|---|---|---|---|---|
下标 | 1 | 2 | 3 | 4 | 5 |
不难发现,尽管 这个结点不存在,但是为了能够适用父子下标关系,它也需要占一个位置——这样在树的形状不是很规则的情况下,便会造成大量空间的浪费,因此提出了链式存储。
二叉链表与三叉链表
二叉链表表示树比三叉链表所需空间少,然而想要达到访问双亲的目的,就需要对树进行遍历。
三叉链表比二叉链表多了
指针用来记录双亲结点,可以很快达到访问双亲的目的。
选择使用哪种表示方法还要看具体场景。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef char ElemType;
typedef struct Node{
ElemType data;
struct Node *lnode, *rnode;
struct Node *parent;
}BiNode, TriNode;
void PreOrderTraverse(BiNode *btree)
{
if(!btree)
printf("#");
else{
printf("%c", btree->data);
PreOrderTraverse(btree->lnode);
PreOrderTraverse(btree->rnode);
}
}
void CreateBiNode(BiNode *&btree) // 二叉链表表示树
{
ElemType data;
scanf("%c", &data);
if(data == '#')
btree = NULL;
else{
if(!(btree = (BiNode *)malloc(sizeof(BiNode)))) exit(0);
btree->data = data;
CreateBiNode(btree->lnode);
CreateBiNode(btree->rnode);
}
}
void CreateTriNode(TriNode *&tritree, TriNode *temp, bool flag) // 三叉链表表示树
{
char data;
scanf("%c", &data);
if(data == '#')
tritree = NULL;
else{
if(!(tritree = (TriNode *)malloc(sizeof(TriNode)))) exit(0);
if(!flag)
tritree->parent = NULL;
else tritree->parent = temp;
tritree->data = data;
CreateTriNode(tritree->lnode, tritree, true);
CreateTriNode(tritree->rnode, tritree, true);
}
}
int main()
{
BiNode *root;
TriNode *tri;
//CreateBiNode(root);
//PreOrderTraverse(root);
CreateTriNode(tri, NULL, false);
PreOrderTraverse(tri);
return 0;
}