算法总结
1.所有大于等于节点的值之和
给定一个二叉搜索树,请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。
提醒一下,二叉搜索树满足下列约束条件:
节点的左子树仅包含键 小于 节点键的节点。
节点的右子树仅包含键 大于 节点键的节点。
左右子树也必须是二叉搜索树。
题解:因为每个节点的值替换成树中大于或者等于该节点值的所有节点值之和,所以要从值最大的结点开始遍历,即二叉搜索树的反向遍历,拿一个变量做大于或大于当前结点值之和,在重新赋值给当前结点
package com.chenghaixiang.jianzhi2.day18; /** * @author 程海翔 * @school 石家庄铁道大学 */ public class Office054 { } //给定一个二叉搜索树,请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 // // // //提醒一下,二叉搜索树满足下列约束条件: // // 节点的左子树仅包含键 小于 节点键的节点。 // 节点的右子树仅包含键 大于 节点键的节点。 // 左右子树也必须是二叉搜索树。 class Solution02 { int sum=0; //反向中序遍历,累加各个节点的值,这样得出来的数必定是二次搜索树 public TreeNode convertBST(TreeNode root) { if(root!=null){ convertBST(root.right); sum+= root.val; root.val=sum; convertBST(root.left); } return root; } }
2.二叉搜索树迭代器
实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器:
BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。
boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false 。
int next()将指针向右移动,然后返回指针处的数字。
注意,指针初始化为一个不存在于 BST 中的数字,所以对 next() 的首次调用将返回 BST 中的最小元素。
可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 的中序遍历中至少存在一个下一个数字。
题解:(next()是指按中序遍历当前指针,位置从0开始,hasnext()是指指针下一个是否元素),将二叉搜索树中序遍历扁平化后即可
package com.chenghaixiang.jianzhi2.day18; import java.util.ArrayList; import java.util.List; /** * @author 程海翔 * @school 石家庄铁道大学 */ public class Office055 { } //实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: // // BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。 // boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false 。 // int next()将指针向右移动,然后返回指针处的数字。 // //注意,指针初始化为一个不存在于 BST 中的数字,所以对 next() 的首次调用将返回 BST 中的最小元素。 // //可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 的中序遍历中至少存在一个下一个数字。 //next()是指按中序遍历当前指针位置从0开始,hasnext()是指指针下一个是否元素 class BSTIterator { //扁平化 private int idx; //线性存储中序遍历的值 private List<Integer> arr; public BSTIterator(TreeNode root) { idx=0; arr=new ArrayList<>(); inorder(root,arr); } void inorder(TreeNode root,List<Integer> arr){ if(root==null){ return; } inorder(root.left,arr); arr.add(root.val); inorder(root.right,arr); } public int next() { return arr.get(idx++); } public boolean hasNext() { //即按中序遍历是否遍历完 return idx<arr.size(); } }