该帖主要对二叉树的常见算法题进行总结,也是方便查看,具体的题目要求和思路可以点开链接查看,欢迎大家指点。
1 二叉树的前序遍历
(1)访问根节点;
(2)递归遍历左子树;
(3)递归遍历右子树;
递归前序遍历
public void preTraversal(Node node){
if (node != null) {
System.out.print(node.val+" ");
preTraversal(node.left);
preTraversal(node.right);
}
}
非递归前序遍历:
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root==null){
return list;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode res = stack.pop();
if(res.right != null)
stack.push(res.right);
if(res.left != null)
stack.push(res.left);
list.add(res.val);
}
return list;
}
2 中序遍历:
(1)遍历左子树;
(2)访问根节点;
(3)遍历右子树
递归:
public void MidTraversal(Node node){
if (node != null) {
MidTraversa(node.left);
System.out.print(node.val+" ");
MidTraversa(node.right);
}
}
非递归:
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root==null){
return list;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode curr = root;
while(curr != null || !(stack.isEmpty())){
if(curr!= null){
stack.push(curr);
curr = curr.left;
}else{
curr = stack.pop();
list.add(curr.val);
curr = curr.right;
}
}
return list;
}
3 后序遍历:
(1)采用后序递归遍历左子树;
(2)采用后序递归遍历右子树