剑指offer编程题(JAVA实现)——第22题:从上往下打印出二叉树

本文提供了一种使用双栈实现的从上至下打印二叉树的算法,详细介绍了如何通过两个栈来确保节点从上到下、从左到右的正确打印顺序。同时,还提供了一个使用队列的替代方案,展示了不同数据结构在解决同一问题时的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



githubhttps://github.com/JasonZhangCauc/JZOffer
import java.util.ArrayList;
import java.util.Stack;


/**
 * 
 * 剑指offer编程题(JAVA实现)——第22题:从上往下打印出二叉树
 * 
 * 题目描述
 * 从上往下打印出二叉树的每个节点,同层节点从左至右打印。
 *
 */
public class Test22 {

	ArrayList<Integer> arrayList = new ArrayList<>();
	// 每层依次入栈
	Stack<TreeNode> stack1 = new Stack<>();
	// 从stack1出栈的元素依次加入stack2,统一通过stack2找到他们的字节点并压入stack1
	Stack<TreeNode> stack2 = new Stack<>();

	public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {

		if (root == null) {
			return arrayList;// 空则返回
		}
		stack1.push(root);
		while (!stack1.isEmpty()) {
			while (!stack1.isEmpty()) {
				TreeNode tmp = stack1.pop();
				arrayList.add(tmp.val);
				stack2.push(tmp);
			}
			while (!stack2.isEmpty()) {
				TreeNode tmp2 = stack2.pop();
				// 从左到右打印,所以右子树先入栈
				if (tmp2.right != null) {
					stack1.push(tmp2.right);
				}
				if (tmp2.left != null) {
					stack1.push(tmp2.left);
				}
			}
		}

		return arrayList;

	}

	public class TreeNode {
		int val = 0;
		TreeNode left = null;
		TreeNode right = null;

		public TreeNode(int val) {
			this.val = val;

		}
	}

}
//其他方法
/**
public class Solution {
     public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
         ArrayList<Integer> list = new ArrayList<Integer>();
         if(root == null) return list;
         Deque<TreeNode> deque = new LinkedList<TreeNode>();
         
         deque.add(root);
         while(!deque.isEmpty()){
             TreeNode t = deque.pop();
             list.add(t.val);
             if(t.left != null) deque.add(t.left);
             if(t.right != null) deque.add(t.right);
         }
         return list;
     }
}
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

花月诗人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值