数据结构与算法_实验四二叉树

实验名称

实验四树和二叉树

实验目的

1、二叉树的定义、递归遍历及其它基本操作的实现

实验任务

实现二叉链表表示的二叉树,完成二叉树的基本操作:

初始化二叉树、按前序次序建立一个二叉树、检查二叉树是否为空、按任一种遍历次序(包括按前序、中序、后序、按层次)输出二叉树中的所有结点、求二叉树的深度、求二叉树中所有结点数、清除二叉树。

实验内容

BinaryTree.h

#ifndef _BINARY_TREE_H_

#define  _BINARY_TREE_H_

template <class T>

class binaryTree {

    public:

        virtual int height() const = 0;

        virtual int size() const = 0;

        virtual void clear()= 0;

        virtual bool empty() const = 0;

        virtual void preOrderTraverse() const = 0;

        virtual void inOrderTraverse() const = 0;

        virtual void postOrderTraverse() const = 0;

        virtual void levelOrderTraverse() const = 0;

        virtual ~binaryTree(){};

};

#endif

BinaryLinkedList.h

#ifndef _BINARY_LINKLIST_H_

#define _BINARY_LINKLIST_H_

#include"BinaryTree.h"

template <class T>

class BinaryLinkList :public binaryTree<T>

{

    private:

        struct Node {

           Node*left,*right;

           T data;

          

           Node() : left(NULL),right(NULL) {}

           Node(T value, Node* l= NULL,Node*r=NULL){

               data = value; left =l;right =r;

           }

           ~Node() {}

        };

        enum Tags{Left,Right};

        struct StackElement{

           Node * pointer;

           Tags tag;

           StackElement(){}

        };

        Node*root;

        void clear(Node*t);

        int size(Node*t)const;

        int height(Node*t)const;

        int leafNum(Node*t)const;

       

        void preOrder(Node*t)const;

        void inOrder(Node*t)const;

        void postOrder(Node*t)const;

       

        void preOrderCreate(T flag ,Node*& t);

       

        public:

           BinaryLinkList() : root(NULL) {}

           ~BinaryLinkList(){c

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
动态二进制树形搜索算法(Dynamic Binary Tree Search Algorithm)是一种常用的防碰撞算法,它通过将标签ID进行二进制拆分,将标签按照不同的二进制位存储在不同的树节点中,实现快速的标签识别和查询。下面我将为您介绍如何设计和实现该算法。 1. 算法设计 (1)确定树的结构:动态二进制树形搜索算法是一种树形搜索算法,因此需要确定树的结构。一般来说,可以采用二叉树叉树。二叉树每个节点最多有两个子节点,而叉树每个节点最多有个子节点。在实际应用中,根据标签数量和查询效率的要求,可以选择不同的树结构。 (2)确定节点存储方式:对于每个节点,需要存储其对应的二进制位数和存储的标签信息。一般来说,可以采用数组或链表等数据结构进行存储。 (3)标签插入:当一个新的标签需要插入时,需要按照其二进制形式逐级向下搜索树,直到找到一个空闲的节点,然后将标签信息存储在该节点上。 (4)标签查询:当需要查询一个标签时,需要按照其二进制形式逐级向下搜索树,直到找到一个节点,该节点存储了该标签信息或者没有子节点。如果找到了该标签信息,则查询成功,否则查询失败。 (5)树的更新:当一个标签需要从树中删除时,需要依次向上搜索其所有的祖先节点,并检查这些节点是否还有其他子节点。如果某个节点已经没有子节点,则将该节点从树中删除。 2. 算法实现 下面是动态二进制树形搜索算法的C++实现代码: ```cpp #include <iostream> #include <vector> #include <bitset> using namespace std; // 树节点结构体 struct TreeNode { int depth; // 节点深度 int tag; // 标签信息 TreeNode* left; // 左子节点 TreeNode* right; // 右子节点 TreeNode(int depth, int tag) { this->depth = depth; this->tag = tag; this->left = NULL; this->right = NULL; } }; // 二进制数转换为字符串 string toBinaryString(int num) { bitset<32> bits(num); return bits.to_string(); } // 插入标签 void insertTag(TreeNode* root, int tag) { string tagStr = toBinaryString(tag); TreeNode* curNode = root; for (int i = 0; i < tagStr.length(); i++) { if (tagStr[i] == '0') { if (curNode->left == NULL) { curNode->left = new TreeNode(i, -1); } curNode = curNode->left; } else { if (curNode->right == NULL) { curNode->right = new TreeNode(i, -1); } curNode = curNode->right; } } curNode->tag = tag; } // 查询标签 bool searchTag(TreeNode* root, int tag) { string tagStr = toBinaryString(tag); TreeNode* curNode = root; for (int i = 0; i < tagStr.length(); i++) { if (tagStr[i] == '0') { if (curNode->left == NULL) { return false; } curNode = curNode->left; } else { if (curNode->right == NULL) { return false; } curNode = curNode->right; } } return curNode->tag == tag; } // 删除标签 void deleteTag(TreeNode* root, int tag) { string tagStr = toBinaryString(tag); vector<TreeNode*> path; TreeNode* curNode = root; for (int i = 0; i < tagStr.length(); i++) { path.push_back(curNode); if (tagStr[i] == '0') { curNode = curNode->left; } else { curNode = curNode->right; } } curNode->tag = -1; for (int i = path.size() - 1; i >= 0; i--) { if (path[i]->left == NULL && path[i]->right == NULL) { if (i == 0) { delete root; root = NULL; } else { if (path[i-1]->left == path[i]) { delete path[i-1]->left; path[i-1]->left = NULL; } else { delete path[i-1]->right; path[i-1]->right = NULL; } } } else { break; } } } int main() { TreeNode* root = new TreeNode(0, -1); insertTag(root, 10); insertTag(root, 5); insertTag(root, 15); insertTag(root, 12); insertTag(root, 20); cout << searchTag(root, 10) << endl; // 1 cout << searchTag(root, 7) << endl; // 0 deleteTag(root, 20); cout << searchTag(root, 20) << endl; // 0 return 0; } ``` 在该实现中,我们使用了二叉树作为树的结构,使用了数组来存储每个节点的信息。具体实现过程如下: (1)我们先定义了一个TreeNode结构体,它包含了节点的深度、标签信息和左右子节点。 (2)我们使用了toBinaryString函数将一个十进制数转换成二进制字符串。 (3)我们定义了insertTag函数,它将标签插入到树中。具体实现过程是,按照标签的二进制形式逐级向下搜索树,并在找到一个空闲的节点时将标签信息存储在该节点上。 (4)我们定义了searchTag函数,它用于查询一个标签。具体实现过程是,按照标签的二进制形式逐级向下搜索树,如果找到了标签信息,则查询成功,否则查询失败。 (5)我们定义了deleteTag函数,它用于删除一个标签。具体实现过程是,先查询到该标签所在的节点,将该节点的标签信息置为-1,然后从该节点向上依次检查其所有的祖先节点,如果某个节点已经没有子节点,则将该节点从树中删除。 3. 总结 动态二进制树形搜索算法是一种常用的防碰撞算法,它可以快速地插入、查询和删除标签。在实际应用中,我们可以根据标签数量和查询效率的要求,选择不同的树结构和节点存储方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

激稳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值