二叉树可视化创建(二叉树正输出)




















1.上面简单的介绍了二叉树的线性存储.

2.分析二叉树的横向打印.

由于在终端上如果不调用系统坐标函数,而只调用printf();来输出,只能是从上到下从左到右进行,根据这一特点我们只需要

知道每个节点所在的x坐标(即前面空了x-1个空格),再加上层次打印就非常容易打印二叉树了,如根节点可以计算的其坐标为

(1,8)第一行第八列.节点置为2的节点坐标(1,6),值为5的节点坐标(1,7).

可以发现一个规律编号为i的节点横坐标为,在中序编列这可二叉树,所对应的次序.

3.根据上述规律可以获得任何节点的横坐标,二纵坐标正好是层数,因此能获得任意节点的横纵坐标

在屏幕输出时从上到下,从左到右,正好通过每个节点的坐标来输出他...但是注意同层i,j,空行是jx-ix这是因为终端从

做到有输出,且累计输出个数.

下面是运行效果,和程序

已建立图上这颗二叉树为例演示.


代码:

#include <stdio.h>
#include <string.h>
#define maxn 10010
#define OVER -1
int tree[maxn]={0};
int pos[maxn]={0};
int count=1;
int my_log2(int n){
	int c=0;
	while(n>=2){
		c++;
		n/=2;
	}
	return c;
}
int my_pow(int m,int n){
	if(n==0)
	      return 1;
	else{
		int ans=my_pow(m,n/2);
		ans*=ans;
		return n%2?ans*m:ans;
	}
}
void init(){
	memset(tree,-1,sizeof(tree));
}
void create(int no){
	scanf("%d",&tree[no]);
	if(tree[no]!=OVER){
		tree[0]++;
		create(no*2);
		create(no*2+1); 
	}
}
void postorder(int no,int space){
	if(tree[no]!=OVER){
		postorder(no*2,space);
		pos[no]=count;
		count+=space;
		printf("no:%d val:%d pos:%d\n",no,tree[no],pos[no]);
		postorder(no*2+1,space);
	}
}
int getWidth(int no){
	return tree[no]==-1?0:getWidth(2*no)+1+getWidth(2*no+1);
}
int print(int root){
	int w=1,no=root,i,j,k,ww;
	int sum=w;
	int flag=false;
	while(true){
		int rear=w+no;
		int lastp=0;
		int havep=1;
		int que[maxn]={0};
		int qrear=0;
		for(;no<rear;no++){
			if(tree[no]!=OVER){
				que[qrear++]=no;
				//打印树根(元素) 
				if(tree[no*2]!=OVER||tree[no*2+1]!=OVER)
					flag=true;
				if(tree[no]!=OVER){
					 for(i=1;i<pos[no]-lastp;i++) 
					 	printf(" ");
				 	 printf("%d",tree[no]);
					 lastp=pos[no];
				}
			}
		}
		printf("\n");
		//打印完一行元素.开始打印树枝
		
		for(i=0;i<qrear;i++){
			int pno=que[i];
			 if(tree[pno*2]!=OVER||tree[pno*2+1]!=OVER){
					if(tree[pno*2]!=OVER){
						for(;havep<pos[pno*2];havep++)
						printf(" ");
						for(;havep<pos[pno];havep++)
						printf("-"); 
						printf("|");
						havep++;
					}
					if(tree[pno*2+1]!=OVER){
						for(;havep<pos[pno];havep++)
						printf(" ");
						if(tree[pno*2]==OVER){
							havep++;
							printf("|");
						}
						for(;havep<=pos[pno*2+1];havep++)
						printf("-");
					}
				}
			}
		printf("\n");
		if(!flag){//某一层没有任何一个元素有孩子节点,就此停止. 
			break;
		}else{
			flag=false;
			w*=2;
			sum+=w;
		}
	}
}
int create_full(int n){
	int i=0;
	n=my_pow(2,n);
	init();
	for(i=1;i<n;i++)
	tree[i]=1;
	return 0;
}
int main(){
	init();
	//create(1);
	create_full(5);
	postorder(1,5);
	printf("\n");
	print(1);
	return 0;
}


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值