前序遍历
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer>list=new LinkedList<>();
Stack<TreeNode>stack=new Stack<>();
if(root==null){
return list;
}
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 List<Integer> inorderTraversal(TreeNode root) {
Stack<TreeNode>stack=new Stack<>();
List<Integer>list=new LinkedList<>();
if (root==null){
return list;
}
stack.push(root);
while (!stack.isEmpty()){
TreeNode tmp=stack.pop();
if(tmp!=null){
//入栈右根左 出栈得到左根右
stack.push(tmp.right);
stack.push(tmp);
stack.push(tmp.left);
}else if(!stack.isEmpty()){
list.add(stack.pop().val);
}
}
return list;
}
后序遍历
public List<Integer> postorderTraversal(TreeNode root) {
Stack<TreeNode>stack=new Stack<>();
LinkedList<Integer>list=new LinkedList<>();
if (root==null){
return list;
}
stack.push(root);
while(!stack.isEmpty()){
TreeNode tmp=stack.pop();
//头插 首先就插入根结点
list.addFirst(tmp.val);
//入栈先左后右 出栈时右树先头插左树后头插 得到左右根
if(tmp.left!=null){
stack.push(tmp.left);
}
if(tmp.right!=null){
stack.push(tmp.right);
}
}
return list;
}