144. 二叉树的前序遍历
给你二叉树的根节点 root
,返回它节点值的 前序 遍历。
示例 1:
输入:root = [1,null,2,3] 输出:[1,2,3]
示例 2:
输入:root = [] 输出:[]
示例 3:
输入:root = [1] 输出:[1]
class Solution {
public List<Integer> preorderTraversal(TreeNode root){
ArrayList<Integer> resList = new ArrayList<>();
//使用一个栈来模拟
Stack<TreeNode> stack = new Stack<>(); //加入栈的是树的节点;
//前序遍历入栈的顺序 中 -->右 -->左
if (root == null){
//如果为空树的情况下直接返回reslist
return resList;
}
TreeNode curnode=root;
stack.push(curnode);
while (!stack.isEmpty()){
//首先弹出栈顶元素;
TreeNode top = stack.pop();
resList.add(top.val);
//前序遍历入栈的顺序 中 -->右 -->左
if (top.right !=null){
//如果左子树不为空
stack.push(top.right);
}
if (top.left !=null){
stack.push(top.left);
}
//出栈的顺序 中 ---左 ---右;
}
return resList;
}
}
94. 二叉树的中序遍历
给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3] 输出:[1,3,2]
示例 2:
输入:root = [] 输出:[]
示例 3:
输入:root = [1] 输出:[1]
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> resList = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
if(root == null){
return resList;
}
TreeNode curNode=root; //定义个指针指向当前遍历的节点;
while (curNode !=null || !stack.isEmpty()){
//如果当前节点不为空,或者栈不为空的话,就直接遍历
if (curNode !=null){
//当前节点不空;
stack.push(curNode);//将当前节点加入到栈中;
curNode=curNode.left;//然后将指针指向左孩子;
}else{
//如果当前节点左孩子为空了;弹出栈顶元素
TreeNode top = stack.pop(); //弹出顶元素
resList.add(top.val);//将栈顶元素的值加入到resList
curNode=top.right; //遍历弹出栈顶元素的右孩子;
}
}
return resList;
}
}
145. 二叉树的后序遍历
简单
988
相关企业
给你一棵二叉树的根节点 root
,返回其节点值的 后序遍历 。
示例 1:
输入:root = [1,null,2,3] 输出:[3,2,1]
示例 2:
输入:root = [] 输出:[]
示例 3:
输入:root = [1] 输出:[1]
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
ArrayList<Integer> resList = new ArrayList<>();
//定义一个栈用来模拟后序遍历;
Stack<TreeNode> stack = new Stack<>();
TreeNode curnode=root;
if (root ==null){
return resList;
}
stack.push(root);
while (!stack.isEmpty()){
TreeNode top = stack.pop();
resList.add(top.val);//弹出栈顶元素;
//后序遍历的顺序 左 -- 右 -- 中 ;翻转一下就是中 -- 右 -- 左;
//当前的遍历是按照这个思路 中 -- 右 -- 左; 然后将reslist数组翻转一下就成了左右中;
if (top.left !=null){
//先左子树进栈;后出栈
stack.push(top.left);
}
if(top.right !=null){
//右子树后进栈,先出栈;
stack.push(top.right);
}
}
//集合接口实现了翻转;
Collections.reverse(resList);
return resList;
}
}