一. 题目描述
给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
原题链接:link.
二. 前序遍历代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
//前序遍历顺序: 根结点,左结点,右结点.
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
//创建一个栈s存储节点,利用栈先进后出的特点模拟二叉树的遍历过程
Stack<TreeNode> s=new Stack<TreeNode>();
//创建一个数组l存储数值
List<Integer> l=new ArrayList<Integer>();
//将根节点压入栈
s.push(root);
// 当栈不为空的时候进行此循环,栈为空表示已经二叉树遍历完成
while(!s.isEmpty())
{
//节点出栈
TreeNode node=s.pop();
//当节点为空,跳出此循环。
//1.只有一个根节点
//2.node为叶子结点
if(node==null){
continue;//仅结束本次循环
}
//节点值存入数组
l.add(node.val);
//右节点入栈
//由于栈是先进后出的特点,所以先进右节点以先取出左节点。
s.push(node.right);
//左节点入栈
s.push(node.left);
}
//Collections.reverse(l);
return l;
}
}
三. 思路拓展
因为:
前序遍历顺序: 根结点,左结点,右结点.
后序遍历顺序: 左结点,右结点,根结点.
对二叉树的前序遍历代码稍作改变,即可成为后序遍历代码。
如何改变?见下图:
(暂时不知道字体怎么居中,有大佬可以教教我不=。=)
故:
1.想要改变左右结点位置,便需要交换左右结点入栈的顺序,则交换程序中以下两行代码的位置即可:
s.push(node.right);//代码34行处
s.push(node.left);//代码36行处
2.最后反转数组,即得到所求结果。
Collections.reverse(l);//代码38行处