二叉樹的三種遍歷方式(遞歸 和 非遞歸)

//先序 遞歸遍歷
public void preorderRecursion(TreeNode root,List list){
if(root != null){
list.add(root.val);
TreeNode left = root.left;
if(left != null){
preorderRecursion(root.left,list);
}
TreeNode right = root.right;
if(right != null){
preorderRecursion(root.right, list);
}
}
}
//先序遍歷非遞歸
public List preorderNotRecursion(TreeNode root){
List result = new ArrayList<>();
Deque stack = new ArrayDeque<>();
TreeNode p = root;
while(!stack.isEmpty() || p != null){
if(p!=null){
stack.push(p);
result.add(p.val);
p = p.left;
}else{
TreeNode node = stack.pop();
p = node.right;
}
}
return result;
}
//中序遞歸
public void inorderRecursion(TreeNode root,List list){
if(root != null){
TreeNode left = root.left;
if(left != null){
inorderRecursion(root.left,list);
}
list.add(root.val);
TreeNode right = root.right;
if(right != null){
inorderRecursion(root.right, list);
}
}
}
//中序非遞歸遍歷
public List inorderNotRecursion(TreeNode root){
List result = new ArrayList<>();
Deque stack = new ArrayDeque<>();
TreeNode p = root;
while(!stack.isEmpty() || p != null){
if(p != null){
stack.push(p);
p = p.left;
}else{
TreeNode node = stack.pop();
result.add(node.val);
p = node.right;
}
}
return result;
}
//後序遞歸
public void postorderRecursion(TreeNode root,List list){
if(root != null){
TreeNode left = root.left;
if(left != null){
postorderRecursion(root.left,list);
}
TreeNode right = root.right;
if(right != null){
postorderRecursion(root.right, list);
}
list.add(root.val);
}
}
//後序非遞歸遍歷
public List postorderNotRecursion(TreeNode root){
LinkedList result = new LinkedList<>();
Deque stack = new ArrayDeque<>();
TreeNode p = root;
while(!stack.isEmpty() || p!= null){
if(p != null){
stack.push(p);
result.addFirst(p.val);
p = p.right;
}else{
TreeNode node = stack.pop();
p = node.left;
}
}
return result;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章