1、Same Tree
链接:https://leetcode.com/problems/same-tree/
思路:递归思想
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p == null && q == null)
return true;
if((p == null && q != null) || (p != null && q == null) || (p.val != q.val))
return false;
return isSameTree(p.left,q.left) && isSameTree(p.right, q.right);
}
2、Binary Tree Preorder Traversal
链接:https://leetcode.com/problems/binary-tree-preorder-traversal/
思路:所有左子树节点入栈,保存,出栈,访问右子树
//非递归
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack();
TreeNode tree = root;
while(tree != null || !stack.isEmpty()){
if(tree != null){
stack.push(tree);
list.add(tree.val);
tree = tree.left;//遍历左子树
}else{
tree = stack.pop();//退栈
tree = tree.right;//遍历右子树
}
}
return list;
}
//递归解
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root != null){
list.add(root.val);
list.addAll(preorderTraversal(root.left));
list.addAll(preorderTraversal(root.right));
}
return list;
}
3、Binary Tree Inorder Traversal
链接:https://leetcode.com/problems/binary-tree-inorder-traversal/
思路:先将根节点压入栈,然后再将其所有左子结点压入栈,然后取出栈顶节点,保存,访问右子树
//非递归
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack();
TreeNode tree = root;
while(tree != null || !stack.isEmpty()){
if(tree != null){
stack.push(tree);
tree = tree.left;//遍历左子树
}else{
tree = stack.pop();//退栈
list.add(tree.val);
tree = tree.right;//遍历右子树
}
}
return list;
}
//递归
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root != null){
list.addAll(inorderTraversal(root.left));
list.add(root.val);
list.addAll(inorderTraversal(root.right));
}
return list;
}
4、Binary Tree Postorder Traversal
链接:https://leetcode.com/problems/binary-tree-postorder-traversal/
思路:采用LinkedList,可以在list头部插入;先序遍历的逆
//非递归
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<Integer> list = new LinkedList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode tree = root;
while (tree != null || stack.size() > 0) {
if (tree != null) {
list.addFirst(tree.val);
stack.push(tree);
tree = tree.right;
} else {
tree = stack.pop();
tree = tree.left;
}
}
return list;
}
//递归
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root != null){
list.addAll(postorderTraversal(root.left));
list.addAll(postorderTraversal(root.right));
list.add(root.val);
}
return list;
}
5、Binary Tree Level Order Traversal
链接:https://leetcode.com/problems/binary-tree-level-order-traversal/
思路:使用队列进行树的层次遍历(广度优先搜索),每层单独输出,使用for循环来实现。
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if(root == null)
return result;
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(root);
while(!queue.isEmpty()){
int size = queue.size();
List<Integer> list = new ArrayList<>();
for(int i = 0; i < size; i++){
TreeNode tree = queue.poll();
list.add(tree.val);
if(tree.left != null)
queue.add(tree.left);
if(tree.right != null)
queue.add(tree.right);
}
result.add(list);
}
return result;
}
6、Binary Tree Level Order Traversal II
链接:https://leetcode.com/problems/binary-tree-level-order-traversal-ii/
思路:使用linkedlist来实现倒序层次输出
public List<List<Integer>> levelOrderBottom(TreeNode root) {
LinkedList<List<Integer>> result = new LinkedList<>();
if(root == null)
return result;
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(root);
while(!queue.isEmpty()){
int size = queue.size();
List<Integer> list = new ArrayList<>();
for(int i = 0; i < size; i++){
TreeNode tree = queue.poll();
list.add(tree.val);
if(tree.left != null)
queue.add(tree.left);
if(tree.right != null)
queue.add(tree.right);
}
result.addFirst(list);
}
return result;
}