基于左子结点/右兄弟结点表示法和二叉链表来实现二叉树ADT
实现二叉树的ADT需要分别实现结点ADT和树ADT,同时也要保证其封装性
二叉链表
树结点ADT的声明以及实现
(1)每一个结点包括其要储存的数据以及左右子节点的指针,通常一颗二叉树中只有根结点能被直接访问,所以要把数据以及子节点的指针设为private
(2)成员函数要包括:
- 构造函数,析构函数(也可以不写)
- 获取和设置结点内储存的数据,左子节点,右子节点
- 判断该节点是否为叶子节点
1 #ifndef _BINNODE_HPP_ 2 #define _BINNODE_HPP_ 3 #include<iostream> 4 using namespace std; 5 class BinNode{ 6 private: 7 char data; 8 BinNode *lc; 9 BinNode *rc; 10 public: 11 BinNode(char dataval,BinNode *l=NULL,BinNode* r=NULL){data=dataval;lc=l;rc=r;} 12 BinNode(BinNode *l=NULL,BinNode* r=NULL){lc=l;rc=r;} 13 void setLeftChild(BinNode *l){lc=l;} 14 void setRightChild(BinNode *r){rc=r;} 15 void setdata(char d){data=d;} 16 BinNode *getlc(){ return lc;} 17 BinNode *getrc(){ return rc;} 18 char getdata(){ return data;} 19 bool isLeaf(){ return lc==NULL&&rc==NULL;} 20 }; 21 #endif
树ADT的声明
成员变量:根结点
基本操作:获取树的高度,结点数目,前序/中序/后序遍历,设置根节点的值,撤销整棵树
1 #ifndef _BINTREE_HPP_ 2 #define _BINTREE_HPP_ 3 #include "BinNode.hpp" 4 #include <iostream> 5 using namespace std; 6 class BinTree{ 7 public: 8 BinNode * root; 9 int depth(BinNode*); 10 int count(BinNode*); 11 void setroot(BinNode*); 12 void clear(BinNode*); 13 void preorder(BinNode*,void(*visit)(BinNode*)); 14 void inorder(BinNode*,void(*visit)(BinNode*)); 15 void postorder(BinNode*,void(*visit)(BinNode*)); 16 }; 17 #endif
树ADT的实现
树很多操作都需要用到递归,学会运用递归是实现这些基本操作的必要条件
而递归可以使用栈来模拟,所以只要理解好了栈就很好理解递归操作了,这里就不赘述了
前序遍历:根节点->左子树->右子树
中序遍历:左子树->根节点->右子树
后序遍历:左子树->右子树->根节点
这三种遍历实现方法大同小异,不同点就在于访问的先后顺序不同罢了
简单的描述一下过程(尝试用栈的知识去理解,先进先出):把递归函数看作是一个元素,若要执行某一层的递归函数,则将该函数入栈,如果函数执行过程中碰到终止条件则终止函数进程即弹栈,反复进行直到栈为空,即所有的函数都被执行完
获取树的高度以及结点的个数也要使用递归,代码的也大同小异
#include "BinTree.hpp" void BinTree::preorder(BinNode* r,void (*visit)(BinNode* c)){ if(r==NULL)return ; visit(r); preorder(r->getlc(),visit); preorder(r->getrc(),visit); } void BinTree::inorder(BinNode* r,void (*visit)(BinNode* c)){ if(r==NULL)return ; inorder(r->getlc(),visit); visit(r); inorder(r->getrc(),visit); } void BinTree::postorder(BinNode* r,void (*visit)(BinNode* c)){ if(r==NULL)return ; postorder(r->getlc(),visit); postorder(r->getrc(),visit); visit(r); } void BinTree::setroot(BinNode* r){