【软件】[Qt\C++] 图形化二叉树——用QT5实现

一、 实验任务(实验题目、目的)
实现二叉树

二、 任务分析

  1. 假设已经有了二叉树,设计可视化算法实现图像
  2. 学习qt
  3. 设置各按钮槽函数
  4. 将可视化算法与二叉树缝合
  5. 优化代码画图步骤
  6. Debug
  7. 准备发csdn和GitHub

三、 实验设计(实验环境、算法、步骤、核心代码等)
环境:QT5 使用QT CREATOR编程(内置帮助快速查询,很方便)

核心可视化代码如下 二叉树的内容较为简单,不当核心。

//x,y start at 0
void MainWindow::drawNode(Node* node,int x_node  ,int y_node,QPainter* painter){
//    const int rate_height = 7;
//    const int rate_width = 10;

//    const int rec_width = this->width()/rate_width-5;
//    const int rec_height = this->height()/rate_height-4;
    if(node==nullptr)
        return ;
    QPoint point(getRecPos(y_node,x_node));

    QRect rec(point,size);
//    QRect rec(x_node*(recWidth+5),y_node*(recHeight+2),recWidth,recHeight);
    painter->setPen(QPen(Qt::blue,3));//设置画笔形式  或者Qpen pen; pen.setColor(QColor(40, 115, 216)); pen.setWidth(2);
    painter->drawRect(rec);
    painter->setPen(QPen(Qt::black));

    QFont font("微软雅黑",18);
    painter->setFont(font);
    painter->drawText(rec,Qt::AlignCenter,QString::number(node->value()));
    qDebug() << "drawNode:"<< node->value() << y_node << x_node;

    if(y_node >= 1){
        if(x_node & 1){
            QPoint p1(getRecPos(y_node,x_node));
            QPoint p2(getRecPos(y_node-1,(x_node-1)/2));
            p1+=QPoint(recWidth/2,0);
            p2+=QPoint(recWidth/2,recHeight);
            painter->drawLine(p1,p2);
        }

        else {
            QPoint p1(getRecPos(y_node,x_node));
            QPoint p2(getRecPos(y_node-1,x_node/2));
            p1+=QPoint(recWidth/2,0);
            p2+=QPoint(recWidth/2,recHeight);
            painter->drawLine(p1,p2);
        }
    }

    if(node->left!=nullptr)
        drawNode(node->left,x_node*2,y_node+1,painter);
    if(node->right!= nullptr)
        drawNode(node->right,x_node*2+1,y_node+1,painter);

}

四、 实验结果

如图
在这里插入图片描述

完整项目请访问:https://github.com/gongfpp/BinaryTreeWithQt

  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 我可以提供一个简单的二叉树代码: #include <QtCore>class BinaryTree { public: BinaryTree() : root(nullptr) {} ~BinaryTree() { if (root != nullptr) delete root; } void insert(int data) { if (root == nullptr) root = new Node(data); else root->insert(data); } void printLevelOrder() { if (root == nullptr) return; else root->printLevelOrder(); }private: class Node { public: Node(int data) : data(data), left(nullptr), right(nullptr) {} ~Node() { if (left != nullptr) delete left; if (right != nullptr) delete right; } void insert(int data) { if (data < this->data) { if (left == nullptr) left = new Node(data); else left->insert(data); } else { if (right == nullptr) right = new Node(data); else right->insert(data); } } void printLevelOrder() { int level = 0; printLevelOrder(level); } void printLevelOrder(int level) { if (left != nullptr) left->printLevelOrder(level + 1); qDebug() << QString("Level: %1, Data: %2").arg(level).arg(data); if (right != nullptr) right->printLevelOrder(level + 1); } private: int data; Node* left; Node* right; }; Node* root; };int main() { BinaryTree bt; bt.insert(5); bt.insert(2); bt.insert(7); bt.insert(3); bt.insert(6); bt.insert(1); bt.insert(4); bt.printLevelOrder(); return 0; } ### 回答2: 下面是使用Qt编写的二叉树代码的示例: ``` #include <QCoreApplication> #include <QDebug> class TreeNode { public: int data; TreeNode* left; TreeNode* right; TreeNode(int value) { data = value; left = nullptr; right = nullptr; } }; class BinaryTree { public: TreeNode* root; BinaryTree() { root = nullptr; } void insert(int value) { root = insertNode(root, value); } void remove(int value) { root = removeNode(root, value); } TreeNode* search(int value) { return searchNode(root, value); } private: TreeNode* insertNode(TreeNode* node, int value) { if (node == nullptr) { return new TreeNode(value); } if (value < node->data) { node->left = insertNode(node->left, value); } else { node->right = insertNode(node->right, value); } return node; } TreeNode* removeNode(TreeNode* node, int value) { if (node == nullptr) { return nullp,tmpl; } if (value < node->data) { node->left = removeNode(node->left, value); } else if (value > node->data) { node->right = removeNode(node->right, value); } else { if (node->left == nullptr && node->right == nullptr) { delete node; node = nullptr; } else if (node->left == nullptr) { TreeNode* temp = node; node = node->right; delete temp; } else if (node->right == nullptr) { TreeNode* temp = node; node = node->left; delete temp; } else { TreeNode* temp = findMinimumNode(node->right); node->data = temp->data; node->right = removeNode(node->right, temp->data); } } return node; } TreeNode* searchNode(TreeNode* node, int value) { if (node == nullptr || node->data == value) { return node; } if (value < node->data) { return searchNode(node->left, value); } else { return searchNode(node->right, value); } } TreeNode* findMinimumNode(TreeNode* node) { while (node->left != nullptr) { node = node->left; } return node; } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); BinaryTree tree; tree.insert(50); tree.insert(30); tree.insert(70); tree.insert(20); tree.insert(40); tree.insert(60); tree.insert(80); qDebug() << "Binary Tree Inorder Traversal:"; printInorderTraversal(tree.root); return a.exec(); } ``` 这段代码使用了Qt的QCoreApplication来运行程序,构建了一个二叉树类(BinaryTree)和一个节点类(TreeNode)。BinaryTree类包含了插入节点(insert)、删除节点(remove)和查找节点(search)的方法。代码中还实现二叉树的中序遍历(printInorderTraversal)方法。 在示例的main函数中,创建了一个二叉树对象(tree),并插入了一些节点。然后,通过调用printInorderTraversal方法,按中序遍历的顺序打印出二叉树的节点值。 这只是一个简单的二叉树实现示例,你可以根据自己的需要对代码进行修改和扩展。 ### 回答3: 好的,下面是使用Qt编写的一个简单的二叉树代码。该代码实现二叉树的创建、插入节点、删除节点,以及前序遍历、中序遍历和后序遍历等基本操作。 ```cpp #include <QCoreApplication> #include <QDebug> struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; class BinaryTree { public: BinaryTree() : root(nullptr) {} void insertNode(int val) { if (root == nullptr) { root = new TreeNode(val); } else { insertNode(root, val); } } void deleteNode(int val) { deleteNode(root, val); } void preOrderTraversal() { preOrderTraversal(root); qDebug() << endl; } void inOrderTraversal() { inOrderTraversal(root); qDebug() << endl; } void postOrderTraversal() { postOrderTraversal(root); qDebug() << endl; } private: TreeNode *root; void insertNode(TreeNode *node, int val) { if (val < node->val) { if (node->left) { insertNode(node->left, val); } else { node->left = new TreeNode(val); } } else { if (node->right) { insertNode(node->right, val); } else { node->right = new TreeNode(val); } } } TreeNode* deleteNode(TreeNode *node, int val) { if (node == nullptr) { return nullptr; } if (val < node->val) { node->left = deleteNode(node->left, val); } else if (val > node->val) { node->right = deleteNode(node->right, val); } else { if (node->left == nullptr) { TreeNode *temp = node->right; delete node; return temp; } else if (node->right == nullptr) { TreeNode *temp = node->left; delete node; return temp; } TreeNode *temp = findMin(node->right); node->val = temp->val; node->right = deleteNode(node->right, temp->val); } return node; } TreeNode* findMin(TreeNode *node) { while (node->left) { node = node->left; } return node; } void preOrderTraversal(TreeNode *node) { if (node) { qDebug() << node->val << " "; preOrderTraversal(node->left); preOrderTraversal(node->right); } } void inOrderTraversal(TreeNode *node) { if (node) { inOrderTraversal(node->left); qDebug() << node->val << " "; inOrderTraversal(node->right); } } void postOrderTraversal(TreeNode *node) { if (node) { postOrderTraversal(node->left); postOrderTraversal(node->right); qDebug() << node->val << " "; } } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); BinaryTree tree; tree.insertNode(5); tree.insertNode(3); tree.insertNode(8); tree.insertNode(2); tree.insertNode(4); tree.insertNode(7); tree.insertNode(9); tree.preOrderTraversal(); tree.inOrderTraversal(); tree.postOrderTraversal(); tree.deleteNode(4); tree.inOrderTraversal(); return a.exec(); } ``` 此代码使用C++的语法,通过Qt的QDebug输出结果。主函数中创建了一个BinaryTree对象,并调用了插入节点、删除节点以及三种遍历方式的函数进行操作和展示效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值