LeetCode:二叉树的前序遍历【144】

题目描述

给定一个二叉树,返回它的 前序 遍历。

示例:

输入: [1,null,2,3]
1
\
2
/
3 输出: [1,2,3]

题目分析

  如果用递归代码的话,很简单,先序遍历,就是先遍历当前节点,接着是左孩子然后是右孩子,到每个孩子都是这样的处理过程。

    public void preorder(TreeNode root,List<Integer> res)
{
if(root==null)
return;
res.add(root.val);
preorder(root.left,res);
preorder(root.right,res);
}

  但是这道题,我们可以用栈来模拟递归的过程,从而加深对递归的理解程度。随便找一个二叉树,我们来手工模拟一下这个出入栈过程:

   

  刚开始的时候1在栈内,也在栈顶。打印完1以后,我们需要把它的两个孩子加入到栈中,此时有一个问题,我们需要先加左还是先加右?

  我们需要把下一个需要打印的元素发在栈顶,如果先加左孩子的话,那么右孩子就会处于栈顶,此时打印栈顶的话就是右孩子的值3,所以栈要先加右孩子,再加左孩子

  所以过程是:【1入栈】、1出栈打印输出1

        【3入栈、2入栈】,2出栈打印输出2,然后【4入栈】,4出栈打印输出4,3出栈打印输出3.

Java题解

public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root==null)
return res;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.empty())
{
TreeNode node = stack.pop();
res.add(node.val);
if(node.right!=null)
stack.push(node.right);
if(node.left!=null)
stack.push(node.left);
}
return res;
}

最新文章

  1. iOS app内存分析套路
  2. 【腾讯Bugly干货分享】基于RxJava的一种MVP实现
  3. WinForm程序全局捕捉异常处理办法
  4. 作业七:团队项目——Alpha版本冲刺阶段-04
  5. iOS - Swift PList 数据存储
  6. Matlab找二维数组最大值
  7. html5 之 canvas 相关知识(三)API-strokeStyle-shadow相关
  8. SNMP监控一些常用OID的总结
  9. Java was started but returned exit code=13 C:\ProgramData\Oracle\Java\javapath\javaw.exe
  10. C#,json字符串转换成Json对象
  11. 读书笔记 effective c++ Item 31 把文件之间的编译依赖降到最低
  12. ScheduledFuture和RunnableScheduledFuture详解
  13. Appium环境搭建(Windows版)
  14. php常用面试题
  15. Esper剖析
  16. 自己动手造拖拉机轮子系列 -(react-loadable)
  17. C# 验证给定的字符串形式的日期是否合法
  18. linux磁盘管理 磁盘查看操作
  19. hbase源码系列(二)HTable 探秘
  20. Oracle EBS中有关Form的触发器的执行顺序

热门文章

  1. jsp页面定义的map
  2. tomcat修改默认端口
  3. HTML5 选择前置摄像头,选择后置摄像头
  4. Ubuntu修改默认root及密码
  5. 振铃效应(ringing artifacts)
  6. requestAnimationFrame 实现JS动画
  7. Laravel5.1 搭建博客 --展示简单的首页
  8. centos使用pypy
  9. Yolo+Windows 配置(详细版)
  10. 【BZOJ4711】小奇挖矿 树形DP