二叉树的存储
1 顺序存储结构
将二叉树的所有节点,按照一定的次序,存储到连续的存储单元中,这样一般情况下只能对完全二叉树实现满员存储,而对于一般二叉树,则会浪费一定的存储空间,所以顺序存储一般不适用于树。
2 链式存储结构
一个树节点包含3个部分:数据域(Data),左孩子(Lchild),右孩子(Rchild)。
链式存储结构形成的二叉树称为二叉链表。
结构声明如下:
struct{ datatype data; struct BNode *lchild; struct BNode *rchild; }BNode;
可以看出,二叉链表的定义其实是一种递归定义方式。
3 二叉树的遍历和应用
3.1 先序遍历(DLR)
- 访问根节点
- 访问左孩子
- 访问右孩子
具体算法:
preVisit(BNode *root){ if(root != NULL){ visit(root->data); preVisit(root->lchild); preVisit(root->rchild); } }
3.2 中序遍历(LDR)
- 访问左子树
- 访问根节点
- 访问右子树
具体算法:
midVisit(BNode *root){ if(root != NULL){ midVisit(root->lchild); visit(root->data); midVisit(root->rchild); } }
3.3 后序遍历(LRD)
- 访问左子树
- 访问右子树
- 访问根节点
具体算法:
lastVisit(BNode *root){ if(root != NULL){ lastVisit(root->lchild); lastVisit(root->rchild); visit(root->data); } }
4 求二叉链表的高度算法:
int getHigh(BNode *root){ int lh,rh; if(root == NULL) return 0; else{ lh = getHigh(root->lchild); rh = getHigh(root->rchild); return lh > rh ? lh+1:rh+1; } }