文章目录
leetcode题目链接
节点类
package cn.edu.zut;
/**
* @Classname TreeNode
* @Author jdq8576
* @Date 2019/6/3 8:41
**/
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val){
this.val = val;
}
}
中序遍历
- 遇到一个结点,就把它压入栈,并去遍历它的左子树
- 当左子树遍历结束后,从栈顶弹出这个结点并访问它
- 然后按其右指针再去中序遍历该节点的右子树
public List<Integer> inorderTraversal(TreeNode root) {
if(root==null){
return new ArrayList<>();
}else{
Stack<TreeNode> stack = new Stack<>();
List<Integer> list = new ArrayList<>();
while (root!=null||!stack.isEmpty()){
while (root!=null){// 一路向左把沿途结点压入栈
stack.push(root);
root = root.left;
}
if(!stack.isEmpty()){
root = stack.pop();// 弹出栈
list.add(root.val);
root = root.right;// 转向右节点
}
}
return list;
}
}
先序遍历
先把根节点的值添加到list里面,然后依次入栈右子树,左子树(顺序不能错)。这样首先出栈的才是左子树。
public List<Integer> preorderTraversal(TreeNode root){
if(root==null){
return new ArrayList<>();
}else{
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()){
TreeNode tmp = stack.pop();
list.add(tmp.val);
if(tmp.right!=null)
stack.push(tmp.right);
if(tmp.left!=null)
stack.push(tmp.left);
}
return list;
}
}
后序遍历
后序遍历比较复杂,但是看见网上有个比较好记住的办法:按照与前序相似的方法(前序压栈的顺序是先右后左,这里是先左后右),先得到一个结果,然后对结果倒序一下,就可以了。
public class postorderTraversal {
public List<Integer> postorderTreversal(TreeNode root){
if(root == null){
return new ArrayList<>();
}
else{
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()){
TreeNode tmp = stack.pop();
list.add(tmp.val);
if(tmp.left!=null){
stack.push(tmp.left);
}
if(tmp.right!=null){
stack.push(tmp.right);
}
}
Collections.reverse(list);
return list;
}
}
}