226 反转二叉树
看完题后的思路
- 递归参数 根节点
- 终止条件 root==null
- 递归
root.left=right;
root.right=left;
思路
如上
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode invertTree(TreeNode root) {
invertTree02(root);
return root;
}
public void invertTree02(TreeNode root) {
if (root==null){
return ;
}
TreeNode left = root.left;
root.left=root.right;
root.right=left;
invertTree02(root.left);
invertTree02(root.right);
}
}
复杂度
为什么使用中序遍历不行?
看完题解后的收获
迭代法
public TreeNode invertTree(TreeNode root) {
if (root==null){
return root;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()){
TreeNode pop = stack.pop();
if (pop!=null){
if (pop.left!=null){
stack.push(pop.left);
}
if (pop.right!=null){
stack.push(pop.right);
}
stack.push(pop);
stack.push(null);
}else {
TreeNode pop1 = stack.pop();
TreeNode left = pop1.left;
pop1.left=pop1.right;
pop1.right=left;
}
}
return root;
}
三刷大脑敲出来或再敲一遍
101.对称二叉树 2
看完题后的思路
- 递归参数与返回值 bool f(tree1,tree2)
- 递归出口
- 两棵树有一棵树为空
- 两棵树根节点值不相等
- 外侧两颗树返回值为false 内侧为false
- 递归
判断条件
a=f(外侧);
if(a==false) return false;
b=f(内侧);
return b;
思路
见上文
代码
//101. 对称二叉树
public boolean isSymmetric(TreeNode root) {
if (root==null){
return true;
}
return isSymmetricDG(root.left,root.right);
}
public boolean isSymmetricDG(TreeNode root1,TreeNode root2) {
if (root1==null&&root2==null){
return true;
}else if (root1!=null&&root2!=null){
if (root1.val!=root2.val){
return false;
}
// 此时两根值相等
boolean a = isSymmetricDG(root1.left, root2.right);
if (a==false){
return false;
}
boolean b = isSymmetricDG(root1.right, root2.left);
return b;
}else {// 只有一个为空
return false;
}
}
复杂度
看完答案的收获
迭代法
public boolean isSymmetric(TreeNode root) {
if (root==null){
return true;
}
// 普通队列 可以存空值
Queue<TreeNode> deque = new LinkedList<>();
deque.offer(root.left);
deque.offer(root.right);
while (!deque.isEmpty()){
TreeNode poll01 = deque.poll();
TreeNode poll02 = deque.poll();
// 判断
if (poll01==poll02){
continue;
}
// 妙 层层递进的判断
if (poll01==null||poll02==null||poll01.val!=poll02.val){
return false;
}
// 入队
deque.offer(poll01.left);
deque.offer(poll02.right);
deque.offer(poll01.right);
deque.offer(poll02.left);
}
return true;
}
判断一个为空的代码
if (poll01==poll02){//全为空
return true;
}
// 妙 层层递进的判断
if (poll01==null||poll02==null||poll01.val!=poll02.val){
return false;
}
三刷大脑敲出来或再敲一遍