前序遍历
public List<Integer> preorderTraversal(TreeNode t) {
// 前序遍历,顺序子左右
List<Integer>nodes=new ArrayList<>();
Deque<TreeNode>stack=new ArrayDeque<>();
stack.push(t);
while(!stack.isEmpty()){
t=stack.pop();
nodes.add(t.val);
if(t.right!=null)stack.push(t.right);
if(t.left!=null)stack.push(t.left);
}
return nodes;
}
中序遍历
public List<Integer> midorderTraversal(TreeNode t) {
List<Integer>nodes=new ArrayList<>();
Deque<TreeNode>stack=new ArrayDeque<>();
while(!stack.isEmpty()||t!=null){
while(t!=null){
stack.push(t);
t=t.left;
}
t=stack.pop();
nodes.add(t.val);
t=t.right;
}
return nodes;
}
后序遍历
public List<Integer> afterorderTraversal(TreeNode t) {
List<Integer>nodes=new ArrayList<>();
Deque<TreeNode>stack=new ArrayDeque<>();
TreeNode lastnode=null;
while(!stack.isEmpty()||t!=null){
while(t!=null){
stack.push(t);
t=t.left;
}
TreeNode t1=stack.peek();
if(t1.right==null||lastnode==t1.right){
stack.pop();
nodes.add(t1.val);
lastnode=t1;
t=null;
}else{
t=t1.right;
}
}
return nodes;
}
中序遍历和后序遍历区别在于
中序遍历只走了一次右子
而后序遍历走了两次,需要判断上一次走的是不是右子,如果走了,走左右子的子,否则走右
牛客题霸nc45完整代码
List<List<Integer>>ll=new ArrayList<>();
public int [][] ArrayToInt(List<List<Integer>>ll) {
int [][]res=new int[ll.size()][ll.get(0).size()];
for(int i=0;i<ll.size();i++){
for(int j=0;j<ll.get(i).size();j++){
res[i][j]= ll.get(i).get(j);
}
}
return res;
}
public int[][] threeOrders (TreeNode root) {
// write code here
ll.add(preorderTraversal(root));
ll.add(midorderTraversal(root));
ll.add(afterorderTraversal(root));
return ArrayToInt(ll);
}
public List<Integer> preorderTraversal(TreeNode t) {
// 前序遍历,顺序子左右
List<Integer>nodes=new ArrayList<>();
Deque<TreeNode>stack=new ArrayDeque<>();
stack.push(t);
while(!stack.isEmpty()){
t=stack.pop();
nodes.add(t.val);
if(t.right!=null)stack.push(t.right);
if(t.left!=null)stack.push(t.left);
}
return nodes;
}
public List<Integer> midorderTraversal(TreeNode t) {
List<Integer>nodes=new ArrayList<>();
Deque<TreeNode>stack=new ArrayDeque<>();
while(!stack.isEmpty()||t!=null){
while(t!=null){
stack.push(t);
t=t.left;
}
t=stack.pop();
nodes.add(t.val);
t=t.right;
}
return nodes;
}
public List<Integer> afterorderTraversal(TreeNode t) {
List<Integer>nodes=new ArrayList<>();
Deque<TreeNode>stack=new ArrayDeque<>();
TreeNode lastnode=null;
while(!stack.isEmpty()||t!=null){
while(t!=null){
stack.push(t);
t=t.left;
}
TreeNode t1=stack.peek();
if(t1.right==null||lastnode==t1.right){
stack.pop();
nodes.add(t1.val);
lastnode=t1;
t=null;
}else{
t=t1.right;
}
}
return nodes;
}