ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

算法总结

2022-09-08 23:31:14  阅读:198  来源: 互联网

标签:总结 遍历 BST 二叉 算法 next root 节点


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;
    }
}
View Code

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();
    }
}
View Code

 

标签:总结,遍历,BST,二叉,算法,next,root,节点
来源: https://www.cnblogs.com/chenghaixiang/p/16671216.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有