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


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

(0)
上一篇 2022年8月13日
下一篇 2022年8月13日

相关推荐

发表回复

登录后才能评论