横向打印二叉树

横向打印二叉树

问题描述
二叉树可以用于排序。其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树。

当遇到空子树时,则把该节点放入那个位置。

比如,10 8 5 7 12 4 的输入顺序,应该建成二叉树如下图所示,其中.表示空白。

...|-12
10-|
...|-8-|
.......|...|-7
.......|-5-|
...........|-4
本题目要求:根据已知的数字,建立排序二叉树,并在标准输出中横向打印该二叉树。

输入格式
输入数据为一行空格分开的N个整数。 N<100,每个数字不超过10000。

输入数据中没有重复的数字。

输出格式
输出该排序二叉树的横向表示。为了便于评卷程序比对空格的数目,请把空格用句点代替:

样例输入1
10 5 20
样例输出1
...|-20
10-|
...|-5
样例输入2
5 10 20 8 4 7
样例输出2
.......|-20
..|-10-|
..|....|-8-|
..|........|-7
5-|
..|-4

代码

import java.util.Scanner;

public class 横向打印二叉树 {
	public static int root;//建立根
	public static point[] tree=new point[10005];//建立名为树的数组
	
	static class point{
		public int value;//自身节点编号
		public int father;//父母节点编号
		public int left;//左孩子节点编号
		public int right;//右孩子节点编号
		
		public point(){//全部初始化为0;
			this.value=0;
			this.father=0;
			this.left=0;
			this.right=0;
		}
	}
	
	public void dfs(int start,String s, int n,String s1){
		if(tree[start].value==root)//数的开始值得值为根
			s=s+tree[start].value;//则字符串s就输入这个数的值
		else{
			//我们举个例子来看:
			s=s+"-|-";//如果不为根,则输入数值在-|-;
			/*
			 * 5-|-
			 * 5-|-10
			 * 5-|-10-|-
			 * 5-|-10-|-
			 * 5-|-10-|-8
			 * 5-|-10-|-8-|-
			 * 5-|-10-|-8-|-7
			 * 5-|-
			 * 5-|-4
			 */
			//System.out.println(s);
			s=s+tree[start].value;//之后再加入此时的值
			//System.out.println(s);
		}
		if(tree[start].right>0){//如果右子树有值
			s1=s1+"1";
			//System.out.println(s1);
			dfs(tree[start].right,s,n+1,s1);//下一个遍历
			s1=s1.substring(0,s1.length()-1);//去掉最后一个数,即去掉1
			//System.out.println(s1);
		}
		int len=s.length();
		int cot=0;
		for(int i=0;i<len;i++){
			if(s.charAt(i)=='|'){
				if(s1.length()<=cot+1||s1.charAt(cot)!=s1.charAt(cot+1))
					System.out.print("|");
				else
					System.out.print(".");
				cot++;
			}else if(cot<n){
				System.out.print(".");
			}else{
				System.out.print(s.charAt(i));
			}
		}
		if(tree[start].left>0||tree[start].right>0)//如果有子节点
			System.out.print("-|");//输出-|
		System.out.println();//换行
		if(tree[start].left>0){//这里的意思就是遍历左子树,如果左子树有值则进行下一个遍历,如果下一个值没有了就减去一个值,返回到上一层
			s1=s1+"0";
			//System.out.println(s1);
			dfs(tree[start].left,s,n+1,s1);//左子树
			s1=s1.substring(0,s1.length()-1);
			//System.out.println(s1);
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Main test=new Main();
		Scanner sc =new Scanner(System.in);
		String A=sc.nextLine();
		String[] a=A.split(" ");
		root=Integer.valueOf(a[0]);//第一个数为根节点,在这里赋值
		for(int i=0;i<tree.length;i++)//每一个位置都变为0
			tree[i]=new point();
		for(int i=0;i<a.length;i++){
			int m=Integer.valueOf(a[i]);//把a[i]赋值给m
			tree[m].value=m;//数的改位子的值为m
		}
		for(int i=1;i<a.length;i++){
			int m=Integer.valueOf(a[i]);
			int temp=root;
			while(true){//循环输出
				if(m>temp){//如果第一个数大于根节点
					if(tree[temp].right==0){//如果根节点右边节点为0
						tree[temp].right=m;//则把根节点的右子树插入m
						break;
					}else
						temp=tree[temp].right;//或者是说,再进行下一步探索
				}else{//如果小于
					if(tree[temp].left==0){//当左子树为0
						tree[temp].left=m;//插入
						break;
					}else
						temp=tree[temp].left;//进行下一步操作
				}
			}
		}
		String s="";
		String s1="";
		test.dfs(root, s, 0, s1);
	}
}

好的,我来回答您的问题。 首先,按凹入表形式横向打印二叉树结构是一种常用的二叉树可视化方式,可以直观地展示二叉树的结构。具体实现过程如下: 1. 定义一个结构体Node表示二叉树的节点,包含数据域和指向左右子节点的指针。 2. 定义一个函数printTree以根节点和层数为参数,用于打印二叉树结构。 3. 在printTree函数中,先判断根节点是否为空,如果为空则直接返回。 4. 如果根节点不为空,则打印根节点的数据域,并将当前层数加1。 5. 递归调用printTree函数,传入左子节点和当前层数,用于打印左子树。 6. 递归调用printTree函数,传入右子节点和当前层数,用于打印右子树。 7. 在打印左右子树之前,需要根据当前层数计算出缩进量,并将缩进量作为第一个参数传入printTree函数,用于控制打印格式。 8. 在打印左右子树之后,需要将当前层数减1,以便于回溯到上一层继续打印。 下面是该算法的代码实现: ``` typedef struct Node { int data; struct Node* left; struct Node* right; } Node; void printTree(int indent, int level, Node* root) { if (root != NULL) { int i; for (i = 0; i < indent; i++) { printf(" "); } printf("%d\n", root->data); printTree(indent + 4, level + 1, root->left); printTree(indent + 4, level + 1, root->right); } } ``` 在调试该算法时,可以采用以下步骤: 1. 编写测试用例,包括多种不同的二叉树结构,例如完全二叉树、满二叉树、非完全二叉树等。 2. 运行程序,检查输出结果是否符合预期,特别要注意缩进量是否正确。 3. 如果输出结果不符合预期,可以在printTree函数中加入调试语句,例如打印当前层数、缩进量等,以便于定位问题所在。 4. 如果仍然无法定位问题,可以使用调试工具,例如GDB或Visual Studio Debugger,逐步调试程序,查看变量的值是否正确,以便于找到问题所在。 总之,按凹入表形式横向打印二叉树结构是一种常用的二叉树可视化方式,可以直观地展示二叉树的结构。在调试该算法时,需要注意输出格式和缩进量的正确性,以及使用调试工具辅助定位问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

向上Claire

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

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

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

打赏作者

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

抵扣说明:

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

余额充值