820算法题解答(2022年8月12日更新)

820算法题解答

2021年最后一题:如何判断一个二叉树的结构是否对称(不考虑结点的值,只考虑结构)

解法1

[分析]:常规先序遍历的顺序是:中,左,右;镜像先序遍历的顺序是:中,右,左。
只要常规先序序列和镜像先序序列相等,那么这颗二叉树就是对称的。
[注]:遍历的序列需要包括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;
    }

解法2

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return DFS(root.left, root.right);
    }
    public boolean DFS(TreeNode left, TreeNode right){
        if (left == null && right == null)
            return true;
        if (left == null || right == null)
            return false;
        if (left.val != right.val)
            return false;
        return DFS(left.left, right.right) && DFS(left.right, right.left);
    }
}

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;
        }
    }
posted @ 2022-08-12 23:23  xiiii  阅读(88)  评论(0编辑  收藏  举报