-
二叉树前序遍历按照 根节点 左子树 右子树 的 顺序进行的,也就是根左右。
-
简易记法:将一个节点分为三个边,分别用不同颜色如图表示,从根节点进入从左边开始沿着边进行遍历,由下图可知,路过的红色部分依次为0,1,3,4,7,2,5,8(后面的中序遍历与后续遍历同理!)
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
return preorder_Traversal(root,ans);
}
List<Integer> preorder_Traversal(TreeNode root,List<Integer> ans){
if(root==null)
{
return ans ;
}
ans.add(root.val);
preorder_Traversal(root.left,ans);
preorder_Traversal(root.right,ans);
return ans;
}
}
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
Deque<TreeNode> stack = new LinkedList<>();
List<Integer> list = new ArrayList<>();
while(!stack.isEmpty()||root!=null)
{
while(root!=null)
{
stack.push(root);
list.add(root.val);
root = root.left;
}
root = stack.pop().right;
}
return list;
}
}
二叉树中序遍历
-
二叉树前序遍历按照 左子树 根节点 右子树 的 顺序进行的,也就是 左 根 右。
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
return inorder_Traversal(root,ans);
}
List<Integer> inorder_Traversal(TreeNode root,List<Integer> ans){
if(root==null)
{
return ans ;
}
inorder_Traversal(root.left,ans);
ans.add(root.val);
inorder_Traversal(root.right,ans);
return ans;
}
}
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Deque<TreeNode> stack = new LinkedList<>();
while(!stack.isEmpty()||root!=null)
{
while(root!=null)
{
stack.push(root);
root = root.left;
}
root = stack.pop();
list.add(root.val);
root = root.right;
}
return list;
}
}
二叉树后序遍历
-
二叉树后序遍历按照 左子树 右子树 根节点 的 顺序进行的,也就是 左 右 根。(图中绿色)
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
return postorder_Traversal(root,ans);
}
List<Integer> postorder_Traversal(TreeNode root,List<Integer> ans){
if(root==null)
{
return ans ;
}
postorder_Traversal(root.left,ans);
postorder_Traversal(root.right,ans);
ans.add(root.val);
return ans;
}
}
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
Deque<TreeNode> stack = new LinkedList<>();
List<Integer> list = new ArrayList<>();
TreeNode pre = null ;
while(!stack.isEmpty()||root!=null)
{
while(root!=null)
{
stack.push(root);
root = root.left;
}
root = stack.pop();
if(root.right==null||pre==root.right)
{
list.add(root.val);
pre = root;
root=null;
}
else
{
stack.push(root);
root = root.right;
}
}
return list;
}
}