仅为个人记录复盘学习历程,解题思路来自代码随想录
代码随想录刷题笔记总结网址:
代码随想录
530.二叉搜索树的最小绝对差
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
提供参数:根结点root
主要操作(迭代法):
1.初始化需要的数据:
需要使用模拟递归的栈stack,指向当前节点的指针cur,指向前一节点的指针pre,接收结果的整数res。
2.进行迭代:
2.1迭代条件:当cur!=null||stack不为空时将一直进行迭代。
2.2当cur!=null时,一值向stack中加入当前节点,并向左子节点迭代。(不断向深处的左节点迭代)
2.3当cur==null时,处理空节点和向右节点迭代。
2.3.1重新将cur指针指回遍历到null节点的上一个节点。
2.3.2如果pre指针不为空,判断res和两节点差的绝对值谁更小,覆盖res。
2.3.3将pre指向当前节点
2.3.4将cur指向cur的右节点
代码大致如下:
public int getMinimumDifference(TreeNode root) {//初始化Stack<TreeNode>stack=new Stack<>();TreeNode cur=root;int res=Integer.MAX_VALUE;TreeNode pre=null;//迭代操作while(cur!=null||!stack.isEmpty()){//不断遍历左子节点if(cur!=null){stack.push(cur);cur=cur.left;}//处理遍历到叶子节点的空子结点else{//将cur指针指向当前左空子结点的上一节点cur=stack.pop();if(pre!=null){res=res<Math.abs(cur.val-pre.val)?res:Math.abs(cur.val-pre.val);}pre=cur;cur=cur.right;}}return res;}
501.二叉搜索树中的众数
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
如果众数超过1个,不需考虑输出顺序
提供参数:根结点root
主要操作(递归法+pre,cur指针比较遍历):
1.初始化数据:
初始化pre指针;初始化最大出现频率MaxCount,出现频率count;返回结果集res。
2.递归三要素:
2.1返回值类型和输入参数:
需要输入树的根结点root,由于使用全局变量结果集res返回结果,故返回值类型为void。
2.2终止条件:
如果遇到空节点则返回。
2.3单层递归逻辑:
2.3.1遍历左子树;
2.3.2对count进行判断赋值:
如果pre==null,说明当前节点是整棵树的最左边的第一个叶节点,初始化count=1;
否则pre!=null,
如果cur节点的值和pre节点的值相等,count++;
否则说明既不是第一个叶节点值也和上一个节点不同,重置count=1;
2.3.3更新pre=cur;
2.3.4刷新结果集,如果出现出现频率和最大出现频率相同的元素,加入结果集中。
2.3.5判断是否需要刷新最大出现频率和结果集,如果出现一个元素它的出现频率大于最大出现频率,那么刷新最大出现频率为该元素出现频率,并清空结果集后将该节点加入到结果集中。
2.3.6遍历右子树。
代码大致如下:
//初始化数据private TreeNode pre=null;private List<Integer>res=new ArrayList<>();private int MaxCount=0;private int count=0;public int[] findMode(TreeNode root) {traversal(root);int[]result=new int[res.size()];for(int i=0;i<res.size();i++){result[i]=res.get(i);}return result;}public void traversal(TreeNode cur){//终止条件if(cur==null)return;//遍历左子树traversal(cur.left);//对当前节点count判断赋值if(pre==null)count=1;else if(cur.val==pre.val)count++;else count=1;//更新pre指针pre=cur;//更新结果集if(count==MaxCount)res.add(cur.val);//更新最大出现频率if(count>MaxCount){MaxCount=count;res.clear();res.add(cur.val);}//遍历右子树traversal(cur.right);}