通用树抽象父类——Tree、TreeNode

树的基本概念

  树的定义:
    树是一种非线性的数据结构
    树是由 n(n >= 0)个结点组成的有限集合,若 n = 0,则称之为空树
    树中(n > 0)的首结点,称为根节点,根节点只有直接后继,没有直接前驱
    除根以外的其它结点划分为m (m >= 0)个互不相交的有限集合T0 , T1, …,Tm-1, 每个集合又是一棵树,该树又称为根树的子树

树的示例

  树中度的概念:
    树的结点包含一个数据及若干指向子树的分支
    结点拥有的子树数目称为结点的度
    树中的度为所有结点中度的最大值
    度为0的结点称为叶结点
    度不为0的结点称为分支结点

树的度示例:度为3的树

  树中的前驱和后继:
    结点的直接后继称为该结点的孩子
      相应的,该结点称为孩子的双亲
    结点的孩子的孩子…称为该结点的子孙
      相应的,该结点称为子孙的祖先
    同一个双亲的孩子之间互称兄弟

树的前驱与后继示例

  树中的深度或高度:
    树中结点的最大层次称为树的深度或高度

树中结点的层次示例

  树的有序性:
    如果树中结点的各子树从左向右是有次序的,子树间不能互换位置,则称该树为有序树,否则为无序树

树的有序性示例

  森林的概念:
    森林是由 n(n >= 0)棵互不相交的树组成的集合

3课树组成的森林示例

  树与结点之间的关系:
    树和结点是两个类,树中引用结点(组合关系)

树与结点之间的关系

Tree

实现抽象父类Tree,定义树的基本功能接口
Tree.h

#ifndef __TREE_H_
#define __TREE_H_

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


namespace JYlib
{


/*
        树(抽象类)
基本功能:
    树中的元素插入与删除
    获取树的结点数
    获取树的高度
    获取树的度
    清空树
*/
template < typename T >
class Tree : public Object
{
protected:
    TreeNode<T>* m_root;

    //拷贝构造与赋值构造封装,不允许拷贝或者赋值
    Tree(const Tree<T>& e);
    Tree& operator =(const Tree<T>& e);
public:
    Tree()	{ m_root = NULL; }
    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 bool begin() = 0;
    virtual bool next() = 0;
    virtual T current() = 0;
    virtual bool end() = 0;

    virtual void clear() = 0;

};


}



#endif

TreeNode

实现抽象父类TreeNode,定义结点的基本功能接口
TreeNode.h

#ifndef __TREENODE_H_
#define __TREENODE_H_

#include "Object.h"

namespace JYlib
{

/*
            树节点(抽象类)
增加了指向父结点的指针(工程需求,有许多用处)

使用工厂模式:对每一个节点产生时就进行标记,是否为堆对象
因为堆对象需要析构,其他对象不需要,要加以区分
*/
template < typename T >
class TreeNode : public Object
{
protected:
    bool m_flag;//堆对象标记

    //拷贝构造与赋值构造封装,不允许拷贝或者赋值
    TreeNode(const TreeNode<T>& e);
    TreeNode& operator =(const TreeNode<T>& e);

    /*
    重载new操作符并成为保护成员函数,使得无法在外界new一个对象
    只能使用提供的封装函数NewNode,确保每个成员的标记正确
    */
    void* operator new(unsigned int size) throw()
    {
        return Object::operator new(size);
    }

public:
    T value;
    TreeNode<T>* parent;

    TreeNode()
    {
        parent = NULL;
        m_flag = false;
    }

    bool flag()//返回该结点是否为堆对象
    {
        return m_flag;
    }

    virtual ~TreeNode() = 0;
};

template < typename T >
TreeNode<T>::~TreeNode()//虚函数 实现抽象类
{

}


}

#endif

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下步骤实现: 1. 在源 Tree 的 onSelect 方法中获取选中的节点数据,保存到状态中。 2. 在目标 Tree 的 onDrop 方法中,获取拖拽后的节点数据,将其添加到目标 Tree 中,并根据保存在状态中的节点数据设置选中状态。 具体实现代码如下: ```jsx import { Tree } from 'antd'; const { TreeNode } = Tree; class SourceTree extends React.Component { state = { selectedNode: null, }; onSelect = (selectedKeys, info) => { this.setState({ selectedNode: info.node.props.data }); }; render() { return ( <Tree onSelect={this.onSelect}> <TreeNode key="sourceNode" title="Source Node" data="sourceData" /> </Tree> ); } } class TargetTree extends React.Component { state = { selectedKeys: [], nodes: [], }; onDrop = (info) => { const { nodes } = this.state; const { data } = info.node.props; nodes.push(data); this.setState({ nodes }, () => { const { selectedNode } = this.props; if (selectedNode) { const selectedKeys = nodes.reduce((keys, node, index) => { if (node === selectedNode) { keys.push(index.toString()); } return keys; }, []); this.setState({ selectedKeys }); } }); }; renderTreeNode = (node, index) => { return ( <TreeNode key={index} title={node.title} data={node.data}> {node.children.map(this.renderTreeNode)} </TreeNode> ); }; render() { const { nodes, selectedKeys } = this.state; return ( <Tree onDrop={this.onDrop} selectedKeys={selectedKeys}> {nodes.map(this.renderTreeNode)} </Tree> ); } } class App extends React.Component { render() { const { selectedNode } = this.state; return ( <div> <SourceTree /> <TargetTree selectedNode={selectedNode} /> </div> ); } } ``` 在上面的代码中,SourceTree 组件只包含一个节点,用于展示源。 TargetTree 组件包含多个节点,用于展示目标。在 onDrop 方法中,将拖拽后的节点数据添加到 nodes 状态中,并根据 selectedNode 状态设置选中状态。renderTreeNode 方法用于递归渲染节点。 App 组件用于渲染 SourceTree 和 TargetTree 组件,并将 selectedNode 作为 props 传递给 TargetTree 组件。 注意:这里只是一个简单的示例,实际场景中可能需要根据具体需求进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值