二叉樹前序,中序,後序遞歸非遞歸代碼:二叉樹遍歷
二叉樹按層從左到右打印,從頂部到底部
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> lists = new ArrayList<>();
if (root == null) return lists;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
while ( !queue.isEmpty() ) {
int cur = 0;
int end = queue.size();
ArrayList<Integer> list = new ArrayList<>();
while ( cur < end ) {
TreeNode temp = queue.pop();
list.add(temp.val);
if (temp.left != null) {
queue.add(temp.left);
}
if (temp.right != null) {
queue.add(temp.right);
}
cur++;
}
lists.add(list);
}
return lists;
}
}
二叉樹按層,從底部到頂部
public List<List<Integer>> levelOrder(TreeNode root) {
LinkedList<List<Integer>> lists = new LinkedList<>();
if (root == null) return lists;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
while ( !queue.isEmpty() ) {
int cur = 0;
int end = queue.size();
ArrayList<Integer> list = new ArrayList<>();
while ( cur < end ) {
TreeNode temp = queue.pop();
list.add(temp.val);
if (temp.left != null) {
queue.add(temp.left);
}
if (temp.right != null) {
queue.add(temp.right);
}
cur++;
}
lists.push(list);
}
return lists;
}
二叉樹深度
public int maxDepth(TreeNode root) {
if (root == null) return 0;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
int level = 0;
while ( !queue.isEmpty() ) {
int cur = 0;
int end = queue.size();
while ( cur < end ) {
TreeNode temp = queue.pop();
cur++;
if (temp.left != null) {
queue.add(temp.left);
}
if (temp.right != null) {
queue.add(temp.right);
}
}
level++;
}
return level;
}
二叉樹之字形打印
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> lists = new ArrayList<>();
if (root == null) return lists;
Stack<TreeNode> stack1 = new Stack<>();
Stack<TreeNode> stack2 = new Stack<>();
stack1.add(root);
int level = 1;
while ( !stack1.isEmpty() || !stack2.isEmpty() ) {
List<Integer> list = new ArrayList<>();
if (level % 2 == 1) {
while ( !stack1.isEmpty() ) {
TreeNode temp = stack1.pop();
list.add(temp.val);
if (temp.left != null) {
stack2.push(temp.left);
}
if (temp.right != null) {
stack2.push(temp.right);
}
}
}else {
while ( !stack2.isEmpty() ) {
TreeNode temp = stack2.pop();
list.add(temp.val);
if (temp.right != null) {
stack1.push(temp.right);
}
if (temp.left != null) {
stack1.push(temp.left);
}
}
}
lists.add(list);
level++;
}
return lists;
}
對稱二叉樹
public boolean isSymmetric(TreeNode root) {
return isSymmetric(root, root);
}
private boolean isSymmetric(TreeNode root1, TreeNode root2) {
if (root1 == null && root2 == null) {
return true;
}
if (root1 == null || root2 == null) {
return false;
}
if (root1.val != root2.val) {
return false;
}
return isSymmetric(root1.left, root2.right) && isSymmetric(root1.right, root2.left);
}
翻轉的二叉樹(鏡像二叉樹)
public TreeNode invertTree(TreeNode root) {
if (root == null) return null;
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
root.left = right;
root.right = left;
return root;
}
// 鏡像二叉樹
public void mirror(TreeNode root) {
if (root == null) return;
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
if (root.left != null) {
mirror(root.left);
}
if (root.right != null) {
mirror(root.right);
}
}
判斷是否是平衡二叉樹