Leiten Sie andere Fälle aus einer Instanz ab, um BST ausgewogener zu machen

Einem Mann einen Fisch zu geben, ist nur eine vorübergehende Erleichterung,

Bringe einem Mann das Fischen bei und er wird die Bedürfnisse seines Lebens lösen.

1. Binärer Suchbaum

Binärer Suchbaum (binärer Suchbaum) , auch bekannt als binärer Sortierbaum, binärer Suchbaum.
Seine Eigenschaften sind:

  1. Wenn der linke Teilbaum eines beliebigen Knotens nicht leer ist, ist der Wert aller Knoten im linken Teilbaum kleiner als der Wert seines Wurzelknotens;
  2. Wenn der rechte Teilbaum eines Knotens nicht leer ist, sind die Werte aller Knoten im rechten Teilbaum größer als der Wert seines Wurzelknotens;
  3. Die linken und rechten Unterbäume jedes Knotens sind ebenfalls binäre Suchbäume;

Die Inorder-Durchquerung eines binären Suchbaums (BST) ist eine ansteigende Sequenz . (PS: Immer bereit für Problemlösungen)

Gegenüber anderen Datenstrukturen hat der binäre Suchbaum den Vorteil, dass der Zeitaufwand für das Suchen und Einfügen gering ist . Am besten ist O(log n), am schlechtesten ist O(n)

2. Ausgeglichener binärer Baum

Balanced Binary Tree (Balanced BinaryTree) wird auch als AVL-Baum bezeichnet . Es hat die folgenden Eigenschaften:

Es ist ein leerer Baum oder der Absolutwert der Höhendifferenz zwischen seinem linken und seinem rechten Teilbaum überschreitet nicht 1 , und sowohl der linke als auch der rechte Teilbaum sind ein ausgeglichener binärer Baum.


Thema

1382. Gleichen Sie einen binären Suchbaum aus

Geben Sie bei einem gegebenen binären Suchbaum bitte einen ausgeglichenen .

Um dieses Problem zu lösen, müssen wir zunächst folgendes Wissen haben:

  1. Die Art des binären Suchbaums (Durchlaufen in der Reihenfolge ist eine ansteigende Sequenz);
  2. Ausgeglichene Definition (Höhenunterschied zwischen linkem und rechtem Teilbaum <= 1);
  3. Fähigkeiten - eine geordnete Sequenz in eine ausgewogene BST umwandeln;

Code

class Solution {
    
    
    
    List<Integer> inorders = new ArrayList<>();

    public TreeNode balanceBST(TreeNode root) {
    
    
        if(root == null){
    
    
            return null;
        }
        // 1. 通过中序遍历获得有序序列
        inorder(root);
        // 2. 构建平衡的二叉搜索树
        return buildTree(0,inorders.size()-1);
    }

    // 根据有序序列构建平衡的二叉搜索树
    public TreeNode buildTree(int left,int right){
    
    
        if(left > right){
    
    
            return null;
        }

        int mid = left + (right - left) / 2;

        TreeNode root = new TreeNode(inorders.get(mid));

        root.left = buildTree(left,mid-1);

        root.right = buildTree(mid+1,right);

        return root;
    }

    // 因为中序遍历不是本题的考察点,故这里采用 "递归版本"的中序遍历
    public void inorder(TreeNode root){
    
    
        if(root == null){
    
    
            return;
        }

        inorder(root.left);
        inorders.add(root.val);
        inorder(root.right);
    }
}

Bereiten Sie sich auf einen regnerischen Tag vor

  1. 94. Inorder Traversal eines Binärbaums (Inorder)

  2. 110. Ausgeglichener binärer Baum

  3. 108. Konvertieren Sie ein sortiertes Array in einen binären Suchbaum

おすすめ

転載: blog.csdn.net/wangcheeng/article/details/123024955