C++数据结构第51课、树的定义与操作

1、树的定义与操作:树是一种非线性的数据结构,树是由 n( n >= 0 ) 个结点组成的有限集合。

— 如果 n= 0,称为空树;
— 如果 n > 0,则:1、有一个特定的称之为(root)的结点;2、根结点只有直接后继,但没有直接前驱;3、除根以外的其它结点划分为 m( m >= 0 ) 个互不相交的有限集合T0, T1, … Tm-1,每个集合又是一棵树,并且称之为根的子树(sub tree)。
在这里插入图片描述
2、树中度的概念

— 树的结点包含一个数据及若干指向子树的分支
结点拥有子树的数目称为结点的度。(度为 0 的结点称为叶结点,度不为 0 的结点称为分支节点)
树的度定义为所有节点中度的最大值

下来来看一个数的度为 3 的示例,如下图所示
在这里插入图片描述
3、树中的前驱和后继

— 结点的直接后继称为该结点的孩子,相应的,该结点称为孩子的双亲;
— 结点的孩子的孩子的 … 称为该结点的子孙,相应的,该结点称为子孙的祖先;
— 同一个双亲的孩子之间互称兄弟。

树的前驱和后继示例:
在这里插入图片描述
4、树中结点的层次
在这里插入图片描述
5、树的有序性
在这里插入图片描述
6、森林的概念:森林是由 n( n >= 0 ) 棵互不相交的树组成的集合
在这里插入图片描述
7、树的一些常用操作

1、将元素插入树中;
2、将元素从树中删除;
3、获取树的结点数;
4、获取树的高度;
5、获取树的度;
6、清空树中的元素;
7、 ......  

在这里插入图片描述
TreeNode.h

#ifndef TREENODE_H
#define TREENODE_H

#include "Object.h"

namespace XiebsLib
{
template <typename T>
class TreeNode : public Object
{
public:
    T value;
    TreeNode<T>* parent;
    
    TreeNode()
    {
        parent = nullptr;
    }
    virtual ~TreeNode() = 0;
};

template <typename T>
TreeNode<T>::~TreeNode()
{
    
}
}
#endif // TREENODE_H

Tree.h

#ifndef TREE_H
#define TREE_H

#include "Object.h"
#include "TreeNode.h"
#include "SharedPointer.h"

namespace XiebsLib
{

template <typename T>
class Tree : public Object
{
protected:
    TreeNode<T>* m_root;

public:
    Tree(){m_root = nullptr;}
    virtual bool insert(TreeNode<T>* node) = 0;
    virtual bool insert(const T& value, TreeNode<T>* parent) = 0;
    virtual SharedPointer< Tree<T> > remove(const T& value) = 0;
    virtual SharedPointer< Tree<T> > remove(TreeNode<T>* node) = 0;
    virtual TreeNode<T>* find(const T& value)const = 0;
    virtual TreeNode<T>* find(TreeNode<T>* node)const = 0;
    virtual TreeNode<T>* root()const = 0;
    virtual int degree()const = 0;
    virtual int count()const = 0;
    virtual int height()const = 0;
    virtual void clear() = 0;
};
}
#endif // TREE_H

小结:

1、树是一种非线性的数据结构,
2、结点拥有唯一前驱(父结点)和若干后继(子结点);
3、树的结点包含一个数据及若干指向其他结点的指针,
4、树与结点在程序中表现为特殊的数据类型

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值