Leetcode 226
题目链接:翻转二叉树
就是遍历每一个节点,交换每一个节点的左右节点就可以。只需要注意不可以使用中序遍历
public TreeNode invertTree(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
if(root != null) queue.offer(root);
while(!queue.isEmpty()){
TreeNode cur = queue.poll();
if(cur!=null) {
TreeNode temp = cur.left;
cur.left = cur.right;
cur.right = temp;
queue.offer(cur.left);
queue.offer(cur.right);
}
}
return root;
}
Leetcode 101
题目链接:对称二叉树
一些思维定式需要克服,如果递归之传入一个cur节点,那么递归cur节点的左右是肯定无法做到同时在一个函数的栈中递归到最左叶子节点和最右叶子节点的;但是传入两个节点left和right,分别递归left的left节点,right的right节点就可以做到
初步的思路就是用数组保存中序遍历的结果,然后检查这个数组是不是回文,但是这种思路无法过全部的测试
例如如下样例:
不能通过的测试
按照初步思路结果为true,但是正确答案应该为false
正确思路还是要通过结构来判断
//递归方法
public boolean Compare(TreeNode left, TreeNode right){
if(left==null&&right==null) return true;
else if(left==null&&right!=null) return false;
else if(left!=null&&right==null) return false;
else if(left.val!=right.val) return false;
return Compare(left.left, right.right)&&Compare(left.right, right.left);
}
public boolean isSymmetric(TreeNode root) {
if(root==null) return true;
else return Compare(root.left, root.right);
}
// 非递归方法如下
public boolean isSymmetric(TreeNode root) {
if(root==null) return true;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root.left);
queue.offer(root.right);
while(!queue.isEmpty()){
TreeNode left = queue.poll();
TreeNode right = queue.poll();
if(left==null&&right==null) continue;
if(left==null||right==null||left.val!=right.val) return false;
queue.offer(left.left);
queue.offer(right.right);
queue.offer(left.right);
queue.offer(right.left);
}
return true;
}
Leetcode 104
题目链接:二叉树的最大深度
public int maxDepth(TreeNode root) {
if(root==null) return 0;
return Math.max(maxDepth(root.left), maxDepth(root.right))+1;
}
Leetcode 111
题目链接:二叉树的最小深度
注意题干中的叶子节点,比最大深度需要更多的判断条件!
public int minDepth(TreeNode root) {
if(root==null) return 0;
int left = minDepth(root.left);
int right = minDepth(root.right);
// 判断是否为叶子节点
// 当一个左子树为空,右不为空,这时并不是最低点
if (root.left == null && root.right != null) {
return 1 + right;
}
// 当一个右子树为空,左不为空,这时并不是最低点
if (root.left != null && root.right == null) {
return 1 + left;
}
int result = 1 + Math.min(left, right);
return result;
}