二叉树的前序遍历:前代表根节点的遍历顺序,前就是先遍历根节点,然后是左节点、右节点
一开始不明白,为什么输入的是一个数组,还分左右呢咋,画着画着,突然明白了那个struct结构变量是啥意思了
这个val是当前节点的值,分别给它关联了它的左右节点是什么,left、right就是左右节点的值
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
然后因为栈是先进后出,后进先出,所以想让左节点先出,就后遍历左节点
public List<Integer> preorderTraversal(TreeNode root) {
//声明一个栈
Stack<TreeNode> stack=new Stack<>();
//声明一个List数组,方法要返回List数组,将遍历的非空节点存入List数组
List<Integer> list = new ArrayList<Integer>();
//如果二叉树为空,则返回list数组,这时候list数组并未存入值,也为空
if(root==null) {
return list;
}
//如果二叉树不为空,将根节点推入栈
stack.push(root);
//当栈非空时
while(!stack.isEmpty()){
//每次循环都将栈顶节点出栈
TreeNode node=stack.pop();
// System.out.print(node.val+" ");
//将出栈的节点存入list数组
list.add(node.val);
//因为栈有先进后出的特点,所以,先遍历右节点,左节点后入栈,
//则,出栈时,左节点先出栈,正好满足前序遍历的要求
if(node.right!=null){
stack.push(node.right);
}
if(node.left!=null){
stack.push(node.left);
}
}
//最后方法返回list
return list;
}