1.二叉树里的双指针
1.1判断两颗树是否相同
思路:使用两个指针分别遍历两颗树,相同:根节点相同(值相同),根节点的左右孩子相同!需要满足该条件才可以确定两棵树相同
public boolean isEqual(TreeNode t1,TreeNode t2){
//如果都为空,则两个棵相同
if (t1 == null && t2 == null){
return true;
}
if (t1 == null || t2 == null){
return false;
}
if (t1.val != t2.val){
return false;
}
return isEqual(t1.leftNode,t2.leftNode) && isEqual(t1.rightNode,t2.rightNode);
}
1.2判断某颗树是否对称
思路:外侧 == 外侧 ,内侧 == 内侧 ,遍历根节点,根节点的左孩子的最左侧 == 根节点的右孩子的最右侧......
判断两颗树是否对称:传入的是根节点的左右孩子,则是判断该树是否对称
//t1是根节点的左孩子,t2是根节点的右孩子
//判断某根树是否是对称
public boolean isSymmetry(TreeNode t1,TreeNode t2){
if (t1 == null && t2 == null){
return true;
}
if (t1 == null || t2 == null){
return false;
}
if (t1.val != t2.val){
return false;
}
//判断t1的左孩子是否等于t2的右孩子
//判断t1的右孩子是否等于t2的左孩子
return isSymmetry(t1.leftNode,t2.rightNode) && isSymmetry(t1.rightNode,t2.leftNode);
}
1.3合并两个二叉树
题意:合并为新的二叉树
思路:分别遍历两颗树;比较两二叉树的节点①若两节点其中一个为null,则合并后的节点为不为null的节点值;②若两节点都为null,则合并后的节点为null;③两节点都不为null,则合并后的节点的值为两节点的值之和
//t1,t2分别是两颗二叉树
public TreeNode mergeTwoTreeNode(TreeNode t1,TreeNode t2){
if (t1 == null && t2 == null){
return null;
}
if (t1 == null ){
return t2;
}
if (t2 == null){
return t1;
}
//合并后的节点 mergeNode
TreeNode mergeNode = new TreeNode(t1.val + t2.val);
mergeNode.leftNode = mergeTwoTreeNode(t1.leftNode,t2.leftNode);
mergeNode.rightNode = mergeTwoTreeNode(t1.rightNode,t2.rightNode);
return mergeNode;
}
2.路径专题
2.1二叉树的所有路径
/**
* 寻找二叉树从根节点到叶子节点的全部路径(使用前序遍历) 中左右
* @param root 二叉树
* @param paths 单条路径
* @param res 全部路径的结果
*/
public static void traversal(TreeNode root, List<Integer> paths, List<String> res) {
paths.add(root.val);
//终止条件
if (root.leftNode==null && root.rightNode==null){
res.add(paths.toString());
}
if (root.leftNode != null){
traversal(root.leftNode,paths,res);
//回溯
paths.remove(paths.size() - 1);
}
if (root.rightNode != null){
traversal(root.rightNode,paths,res);
paths.remove(paths.size() - 1);
}
}
此处输出格式和实例不同,应做转换!
2.2判断二叉树路径总和情况
public boolean isPathEqual(TreeNode root,int sum){
if (root == null){
return false;
}
if (root.leftNode == null && root.rightNode == null){
return root.val == sum;
}
boolean left = isPathEqual(root.leftNode,sum-root.val);
boolean right = isPathEqual(root.rightNode,sum-root.val);
return left || right ;
}
3.翻转
思路:从根节点开始,交换左右孩子...
先考虑遍历顺序,若前序遍历,先处理根节点,再考虑孩子节点
public TreeNode invertTree(TreeNode root){
if (root == null){
return null;
}
//交换左右孩子
TreeNode temp = root.leftNode;
root.leftNode = root.rightNode;
root.rightNode = temp ;
invertTree(root.leftNode);
invertTree(root.rightNode);
return root;
}