对应力扣的题目如下:
二叉树的前序遍历https://leetcode-cn.com/problems/binary-tree-preorder-traversal/二叉树的中序遍历https://leetcode-cn.com/problems/binary-tree-inorder-traversal/二叉树的后序遍历https://leetcode-cn.com/problems/binary-tree-postorder-traversal/三种遍历的递归方法基本上相同。前序遍历和中序遍历的非递归方法基本上相同,而后序遍历的非递归方法需要多添加一个prev来记录上一个被遍历的结点。
一. 前序遍历
递归法:
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> lists = new LinkedList<>();
preorder(root, lists);
return lists;
}
public void preorder(TreeNode root,List<Integer> res) {
if(root==null){
return;
}
res.add(root.val);
preorder(root.left,res);
preorder(root.right,res);
}
非递归法:
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
if (root==null){
return list;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (cur!=null||!stack.isEmpty()){
while (cur!=null){
list.add(cur.val);
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
cur = cur.right;
}
return list;
}
二. 中序遍历
递归法:
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> lists = new LinkedList<>();
inorder(root,lists);
return lists;
}
public void inorder(TreeNode root,List<Integer> res) {
if(root==null){
return;
}
inorder(root.left,res);
res.add(root.val);
inorder(root.right,res);
}
非递归法:
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
if (root==null){
return list;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while(cur!=null||!stack.isEmpty()){
while(cur!=null){
stack.add(cur);
cur = cur.left;
}
cur = stack.pop();
list.add(cur.val);
cur = cur.right;
}
return list;
}
三. 后序遍历
递归法:
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new LinkedList<>();
postorder(root,res);
return res;
}
public void postorder(TreeNode root,List<Integer> res) {
if(root==null){
return;
}
postorder(root.left,res);
postorder(root.right,res);
res.add(root.val);
}
非递归法:
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
if (root==null){
return list;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
TreeNode prev = null;
while(cur!=null||!stack.isEmpty()){
while(cur!=null){
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
if(cur.right==null || cur.right==prev){
list.add(cur.val);
prev = cur;
cur = null;
}else{
stack.push(cur);
cur = cur.right;
}
}
return list;
}