1.前序
递归
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<Integer>();
if(root!=null){
list.add(root.val);
list.addAll(preorderTraversal(root.left));
list.addAll(preorderTraversal(root.right));
}
return list;
}
迭代
前序就是深度优先遍历,使用stack。
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result=new ArrayList<Integer>();
Stack<TreeNode> stack=new Stack<>();
if(root==null)
return result;
stack.push(root);
while(!stack.isEmpty()){
TreeNode pNode=stack.pop();
result.add(pNode.val);
if(pNode.right!=null)
stack.push(pNode.right);
if(pNode.left!=null)
stack.push(pNode.left);
}
return result;
}
另一种写法
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<Integer>();
Stack<TreeNode> s=new Stack<>();
TreeNode top=root;
while(top!=null || !s.isEmpty()){
while(top!=null){
list.add(top.val);
s.push(top);
top=top.left;
}
top=s.pop();
top=top.right;
}
return list;
}
2.中序
递归
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<Integer>();
if(root!=null){
list.addAll(inorderTraversal(root.left));
list.add(root.val);
list.addAll(inorderTraversal(root.right));
}
return list;
}
迭代:
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<Integer>();
Stack<TreeNode> s=new Stack<>();
TreeNode top=root;
while(top!=null || !s.isEmpty()){
while(top!=null){
s.push(top);
top=top.left;
}
top=s.pop();
list.add(top.val);
top=top.right;
}
return list;
}
3.后序
递归:
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<Integer>();
if(root!=null){
postorderTraversal(root.left);
postorderTraversal(root.right);
list.add(root.val);
}
return list;
}
迭代:
后序的迭代比较麻烦,输出的条件是
1.此节点是叶子节点。
2.此节点的叶子节点都已经输出
所以用一个pre节点保存上一次访问的节点。
public List<Integer> postOrderTrace(Tree root) {
List<Integer> list = new ArrayList<Integer>();
Stack<Tree> s = new Stack<>();
Tree top = root;
Tree pre=null;
while (top != null || !s.isEmpty()) {
while (top != null) {
s.push(top);
top = top.left;
}
top = s.peek();
if (top.right != null && pre != top.right) {
top = top.right;
} else {
top = s.pop();
list.add(top.val);
pre = top;
top = null;
}
}
return list;
}
// 或者
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<Integer>();
if(root==null)
return list;
Stack<TreeNode> s=new Stack<>();
s.push(root);
TreeNode top,pre=null;
while(!s.isEmpty()){
top=s.peek();
if((top.left==null && top.right==null ) || (pre!=null && (top.left==pre || top.right==pre))){
list.add(top.val);
s.pop();
}else{
if(top.right!=null){
s.push(top.right);
}
if(top.left!=null){
s.push(top.left);
}
}
pre=top;
}
return list;
}