基于左子结点/右兄弟结点表示法和二叉链表来实现二叉树ADT

本文详细介绍了如何使用左子结点/右兄弟结点表示法和二叉链表来实现二叉树的抽象数据类型(ADT)。内容涵盖了树结点ADT的声明和实现,包括构造函数、成员函数,以及树ADT的声明和实现,涉及前序、中序、后序遍历等操作。此外,还提到了构造二叉树的不同方法,并强调了在使用左子节点右兄弟节点表示法时需要注意的遍历终止条件和数组下标问题。
摘要由CSDN通过智能技术生成

基于左子结点/右兄弟结点表示法和二叉链表来实现二叉树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){
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值