leetcode--Binary Tree Postorder Traversal

本文介绍二叉树后序遍历的四种方法:递归、使用栈进行遍历、使用栈与双向链表及另一种栈实现方式。每种方法都提供了详细的步骤解释和对应的Java代码实现。

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

Given a binary tree, return the postorder traversal of its nodes' values.

For example:
Given binary tree {1,#,2,3},

   1
    \
     2
    /
   3

return [3,2,1].


题意:后续遍历二叉树

分类:二叉树


解法1:递归。

[java]  view plain  copy
  1. /** 
  2.  * Definition for a binary tree node. 
  3.  * public class TreeNode { 
  4.  *     int val; 
  5.  *     TreeNode left; 
  6.  *     TreeNode right; 
  7.  *     TreeNode(int x) { val = x; } 
  8.  * } 
  9.  */  
  10. public class Solution {  
  11.     public List<Integer> postorderTraversal(TreeNode root) {  
  12.        List<Integer> res = new ArrayList<Integer>();  
  13.        helper(root,res);  
  14.        return res;  
  15.     }  
  16.       
  17.     public void helper(TreeNode root,List<Integer> res){  
  18.         if(root!=null&&root.left!=null) helper(root.left,res);  
  19.         if(root!=null&&root.right!=null) helper(root.right,res);  
  20.         if(root!=null) res.add(root.val);  
  21.     }  
  22. }  


解法2:使用栈进行遍历。对于根节点而已,将最左边的节点全部入栈。考察最后一个入栈的左节点,判断其右子树是否存在。如果不存在,访问这个节点,让这个节点退栈,接着访问上一个节点。

如果存在,先访问右子树。

[java]  view plain  copy
  1. /** 
  2.  * Definition for a binary tree node. 
  3.  * public class TreeNode { 
  4.  *     int val; 
  5.  *     TreeNode left; 
  6.  *     TreeNode right; 
  7.  *     TreeNode(int x) { val = x; } 
  8.  * } 
  9.  */  
  10. public class Solution {  
  11.     public List<Integer> postorderTraversal(TreeNode root) {  
  12.         List<Integer> res = new ArrayList<Integer>();  
  13.         if(root==nullreturn res;  
  14.         Stack<TreeNode> stack = new Stack<TreeNode>();  
  15.         TreeNode cur = root;  
  16.         do{  
  17.             while(cur!=null){//将最左边的节点全部入栈  
  18.                 stack.add(cur);  
  19.                 cur = cur.left;  
  20.             }  
  21.             TreeNode p = null;  
  22.             while(!stack.isEmpty()){  
  23.                 cur = stack.peek();//考察当前节点  
  24.                 if(cur.right==p){//如果当前节点的右节点已经被访问过  
  25.                     stack.pop();//出栈  
  26.                     res.add(cur.val);//访问当前节点  
  27.                     p = cur;  
  28.                 }else{//如果右节点没有被访问,右节点入栈  
  29.                     cur = cur.right;  
  30.                     break;  
  31.                 }  
  32.             }  
  33.         }while(!stack.isEmpty());  
  34.         return res;  
  35.     }  
  36. }  

解法3:使用栈与双向链表。对于根节点而已,后续遍历时先左子树,在右子树,后根节点。

所以每次遍历,将相应节点添加到链表头部。所以顺序编程,先根节点,再右子树,后左子树。

[java]  view plain  copy
  1. /** 
  2.  * Definition for a binary tree node. 
  3.  * public class TreeNode { 
  4.  *     int val; 
  5.  *     TreeNode left; 
  6.  *     TreeNode right; 
  7.  *     TreeNode(int x) { val = x; } 
  8.  * } 
  9.  */  
  10. public class Solution {  
  11.     public List<Integer> postorderTraversal(TreeNode root) {  
  12.         LinkedList<Integer> res = new LinkedList<Integer>();  
  13.         if(root==nullreturn res;  
  14.         Stack<TreeNode> stack = new Stack<TreeNode>();  
  15.         stack.add(root);  
  16.         while(!stack.isEmpty()){  
  17.             TreeNode cur = stack.pop();  
  18.             res.addFirst(cur.val);  
  19.             if(cur.left!=null) stack.add(cur.left);//左子树  
  20.             if(cur.right!=null) stack.add(cur.right);//右子树  
  21.         }  
  22.         return res;  
  23.     }  
  24. }  

解法4:

原文链接http://blog.youkuaiyun.com/crazy__chen/article/details/46696117

一、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪和极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图与注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉和极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心和象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值