二叉树可视化

随机产生数据,显示一个二叉树

#include <iostream>
#include <vector>
#include <time.h>

using namespace std;
#define MAX_SIZE 1000

typedef struct Node {
	int key;
	int l, r;                          //左右指针 
} Node;

Node tree0[MAX_SIZE] = {{0, 0, 1}};    //结构体类型数组 
int cnt;

void add(int key, int &root = tree0[0].r) {      //将一个整型键值key添加到一个二叉搜索树中,并且将根节点的地址存储在root中。如果没有传入root参数,则默认使用tree0[0].r作为根节点的地址。

	if (root == 0) 
	{
		root = ++cnt;                   //cnt++ && root=cnt
		tree0[cnt] = {key, 0, 0};
	}
	else
	{
		if (key < tree0[root].key)
			add(key, tree0[root].l);
		else 
			if (key > tree0[root].key)
				add(key, tree0[root].r);
	}
}

在代码后注释,运行是否有错误

void del(int key, int &root = tree0[0].r) {
	if (root == 0)
		return;
	auto &p = tree0[root].r;
	if (key < p.key)
		del(key, p.l);
	else if (key > p.key)
		del(key, p.r);
	else {
		if (p.l == 0 && p.r == 0)
			root = 0;
		else if (p.l == 0 && p.r != 0)
			root = p.r;
		else if (p.l != 0 && p.r == 0)
			root = p.l;
		else if (tree0[p.r].l == 0) { //后继是右子树的根
			tree0[p.r].l = p.l;
			root = p.r;
		} else {
			int last = root;
			root = p.r;
			while (tree0[root].l != 0) { //找右子树的最小值,维护父指针last
				last = root;
				root = tree0[root].l;
			}
			tree0[last].l = tree0[root].r;
			tree0[root].l = p.l;
			tree0[root].r = p.r;
		}
	}
}

//
void show(int root = 1, vector<string> pre = vector<string>(0));

int main() {
	system("cls");
	srand(time(0));
	for (int i = 1; i <= 20; ++i)
		add(rand() % 100);
	show();
	int ch = 1;
	do {
		int temp;
		puts("请输出操作码:");
		puts("1:打印");
		puts("2:删除");
		puts("0:退出");
		cin >> ch;
		if (ch == 1)
			show();
		else if (ch == 2) {
			cin >> temp;
			del(temp);
		}
	} while (ch);
}

inline void trans(vector<string> &x, string before, string after) {
	for (auto &p : x)
		if (p == before) {
			p = after;
			break;
		}
}

void show(int root, vector<string> pre) {
	auto &p = tree0[root];

	if (p.key != 0) {
		vector<string> temp(pre);
		trans(temp, "┌──", "   ");
		trans(temp, "└──", "│  ");
		temp.push_back("┌──");
		show(p.l, temp);
	}

	for (auto &i : pre)
		cout << i;
	if (p.key == 0)
		cout << "null" << endl;
	else
		cout << p.key << endl;

	if (p.key != 0) {
		vector<string> temp(pre);
		trans(temp, "┌──", "│  ");
		trans(temp, "└──", "   ");
		temp.push_back("└──");
		show(p.r, temp);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Java中,你可以使用一些库和工具来可视化二叉树。以下是一个示例,使用Swing库来实现二叉树可视化: ```java import javax.swing.*; import java.awt.*; class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; } } class TreePanel extends JPanel { private TreeNode root; public TreePanel(TreeNode root) { this.root = root; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); drawTree(g, getWidth() / 2, 30, root, getWidth() / 4); } private void drawTree(Graphics g, int x, int y, TreeNode node, int offsetX) { if (node == null) return; g.drawString(String.valueOf(node.val), x, y); if (node.left != null) { int childX = x - offsetX; int childY = y + 50; g.drawLine(x, y, childX, childY); drawTree(g, childX, childY, node.left, offsetX / 2); } if (node.right != null) { int childX = x + offsetX; int childY = y + 50; g.drawLine(x, y, childX, childY); drawTree(g, childX, childY, node.right, offsetX / 2); } } } public class BinaryTreeVisualization { public static void main(String[] args) { TreeNode root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(3); root.left.left = new TreeNode(4); root.left.right = new TreeNode(5); root.right.left = new TreeNode(6); root.right.right = new TreeNode(7); JFrame frame = new JFrame("Binary Tree Visualization"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(800, 600); TreePanel treePanel = new TreePanel(root); frame.add(treePanel); frame.setVisible(true); } } ``` 这个示例创建了一个简单的二叉树,并使用Swing库中的JPanel来实现可视化。在`paintComponent`方法中,使用递归方式遍历二叉树的每个节点,并在对应的位置绘制节点值,并使用`drawLine`方法绘制节点之间的连线。最后,通过创建一个JFrame并将TreePanel添加到其中,可以显示二叉树可视化结果。 你可以根据需要自定义二叉树的结构和样式,以适应你的需求。这只是一个简单的示例,可以作为起点进行扩展和定制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值