820算法题解答
2021年最后一题:如何判断一个二叉树的结构是否对称(不考虑结点的值,只考虑结构)
[分析]:常规先序遍历的顺序是:中,左,右;镜像先序遍历的顺序是:中,右,左。
只要常规先序序列和镜像先序序列相等,那么这颗二叉树就是对称的。
[注]:遍历的序列需要包括null结点
[代码实现]
public static void judgeMirror(TreeNode node){
//两个list用来存储常规先序序列和镜像先序序列
List left = new ArrayList();
List right = new ArrayList();
//分别获取常规先序序列和镜像先序序列的函数
leftOrder(node, left);
rightOrder(node, right);
//将获得的序列进行一一对比,若有不同则非对称,若相同则对称
for (int i = 0; i < left.size(); i++){
if (left.get(i) != right.get(i)){
System.out.println("该树非镜像");
return;
}
}
System.out.println("该树是镜像");
return;
}
public static void leftOrder(TreeNode node, List list){
if (node == null){
//因为不考虑结构,所以若结点为null则add 0
list.add(0);
return;
}
//因为不考虑结构,所以若结点为不为null则add 1
list.add(1);
leftOrder(node.left, list);
leftOrder(node.right, list);
return;
}
public static void rightOrder(TreeNode node, List list){
if (node == null){
list.add(0);
return;
}
list.add(1);
rightOrder(node.right, list);
rightOrder(node.left, list);
return;
}
2020年最后一题:如何获取一个二叉排序树中值小于给定值x的最大的结点target
[分析]:对于当前结点,若是值>=x,则target必定在左孩子取到
若是值<x,则target=当前节点或者在右孩子取到
[注]:注意边界条件
public static TreeNode findMax(TreeNode node, int x){
if (node == null)
return null;
//若是当前结点的值<=x,则在左孩子寻找target
if (node.val >= x)
return findMax(node.left,x);
//否则target=当前结点或者在右孩子中取到
else{
//rightMax即为右孩子中的target
TreeNode rightMax = findMax(node.right,x);
//当rightMax为空时,target即为当前结点;否则为rightMax
return rightMax == null ? node : rightMax;
}
}
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/280242.html