分层打印二叉树

本文介绍了如何通过迭代方法按层次遍历二叉树,并逐层从左到右打印节点。使用两个ArrayList来分别存储当前层和下一层的节点,当当前层的节点为空时,进行层间交换并继续遍历。

问题:

把一个二叉树,安装从root到leaf的顺序把每一层上的node从左到右打印出来。

分析:
利用两个arraylist,一个arraylist装上一层的node, 另一个arraylist装上一层的child。如果上一层arraylist空了,两个arraylist互换。

代码:

//print the binary tree by level
public static void printByLevel(Node node) {
	ArrayList<Node> list1 = new ArrayList<Node>();
	ArrayList<Node> list2 = new ArrayList<Node>();
	
	list1.add(node);
	
	while(list1.size() != 0) {
		for (int i = 0; i < list1.size(); i++) {
			System.out.print(list1.get(i).value + " ");
			if (list1.get(i).leftChild != null) list2.add(list1.get(i).leftChild);
			if (list1.get(i).rightChild != null) list2.add(list1.get(i).rightChild);
		} 
		System.out.println();
		list1.clear();
		
		ArrayList<Node> temp = list1;
		list1 = list2;
		list2 = temp;
	}
}

class Node {
    Node leftChild = null;
    Node rightChild = null;
    String name;

    Node(String name) {
        this.name = name;
    }
}

转载请注明出处:http://blog.youkuaiyun.com/beiyeqingteng/



<think>好的,我现在需要帮助用户解决如何用代码实现打印二叉树结构的问题。首先,我得回想一下用户提供的引用内容,看看有没有相关的信息。用户提到了引用[2]和引用[4],其中引用[2]讨论了用括号法打印二叉树,而引用[4]展示了Python分层打印的代码。这可能是一个关键点。 用户的问题是关于打印二叉树结构,可能有不同的方法,比如括号表示法或者分层打印。我需要先确定用户具体需要哪种方式。根据引用[2],括号法是基于先序遍历,并在适当的位置添加括号和逗号来区分左右子树。而引用[4]中的例子是分层打印,输出结果为12345,可能是指按层序遍历的结果。 我需要将这两种方法都解释清楚,并提供相应的代码示例。首先,处理括号法。根据先序遍历,访问根节点,然后递归处理左右子树。当左子树或右子树存在时,需要添加括号。例如,如果左子树存在但右子树不存在,左子树需要用括号括起来,而右子树不需要。这需要修改先序遍历的代码,在适当的位置插入括号和逗号。 然后是分层打印,也就是层序遍历。这通常使用队列来实现,逐层访问节点,并记录每层的节点值。引用[4]中的代码可能用了一个简单的队列实现,但可能需要更详细的处理,比如处理每层的节点数,或者在打印时换行。 接下来,我需要检查用户提供的引用内容中的代码示例,是否有可以借鉴的部分。例如,引用[4]中的代码片段构造了一个二叉树,并调用printlayer函数,输出结果是一行数字,可能没有分层结构。因此,可能需要更完善的层序遍历代码,确保每层单独打印。 另外,用户提到的引用[3]提到顺序存储适用于完全二叉树和满二叉树,但用户的问题是关于链式结构的打印,所以可能需要使用链式存储结构的遍历方法,如递归或队列。 在实现括号表示法时,需要注意边界情况,比如空子树不需要括号,只有左子树或右子树存在时的处理。例如,当左子树存在而右子树为空时,左子树需要括号,而右子树不需要,反之亦然。这需要递归过程中判断子节点是否存在。 对于分层打印,可能需要使用队列来按层存储节点,并在每一层开始时记录当前层的节点数量,依次处理这些节点,并将它们的子节点加入队列。每处理完一层,就换行或进行其他格式化输出。 现在,我需要编写这两种方法的代码示例,并确保它们符合用户提供的引用中的信息。例如,在括号法中,参考引用[2]中的思路,修改先序遍历代码。在分层打印中,参考引用[4]的示例,但可能需要更详细的实现。 另外,需要注意代码的注释和可读性,使用中文注释可能更适合用户的需求。同时,需要处理节点值为非单字符的情况,但用户示例中的数字可能比较简单,暂时可以假设节点值为单字符或数字。 最后,生成相关问题,帮助用户进一步了解二叉树的其他操作或相关算法。例如,如何实现二叉树的遍历,或者不同打印方式的优缺点。 总结步骤: 1. 介绍括号表示法,基于先序遍历,添加括号和逗号。 2. 提供括号法的Python代码示例。 3. 介绍分层打印法,使用层序遍历和队列。 4. 提供分层打印的Python代码示例。 5. 生成相关问题,如遍历方法、优化等。</think>以下是两种常见的二叉树结构打印实现方法及Python代码示例: ### 方法一:括号表示法(基于先序遍历) 基于引用[2]中提到的括号法原理,通过先序遍历添加括号和逗号: ```python class Node: def __init__(self, val): self.val = val self.left = None self.right = None def print_tree(root): if not root: return "" res = str(root.val) if root.left or root.right: res += "(" res += print_tree(root.left) if root.right: # 右子树存在时才加逗号 res += "," res += print_tree(root.right) res += ")" return res # 测试示例 root = Node(1) root.left = Node(2) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(5) print(print_tree(root)) # 输出:1(2(4,5),3) ``` ### 方法二:分层打印(基于层序遍历) 基于引用[4]的分层打印思路,使用队列实现: ```python from collections import deque class Node: def __init__(self, val): self.val = val self.left = None self.right = None def print_level_order(root): if not root: return q = deque([root]) while q: level_size = len(q) for _ in range(level_size): node = q.popleft() print(node.val, end="") if node.left: q.append(node.left) if node.right: q.append(node.right) print() # 换行表示新层开始 # 测试示例 root = Node(1) root.left = Node(2) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(5) print_level_order(root) """ 输出: 1 23 45 """ ``` 两种方法的对比特点: 1. 括号法能直观显示树结构,但横向展示空间有限[^2] 2. 分层打印更适合展示平衡树的层级关系[^4] 3. 括号法时间复杂度为$O(n)$,空间复杂度$O(h)$(h为树高) 4. 分层打印时间复杂度为$O(n)$,空间复杂度$O(w)$(w为树宽)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值