簡體   English   中英

二進制搜索樹的非遞歸遍歷以更新大小

[英]Non-recursive traversal of binary search tree to update size

原諒我是否提出了要求,但是在搜索時找不到。.所有搜索結果都涉及遍歷二叉樹,就像一個人正在搜索特定節點一樣,因此最終結果是下降左或右等等。

但是遍歷以更新樹的大小又如何呢? 就像說您在底部添加了一個新節點一樣,您必須隨后更新每個節點的大小以反映新樹的大小。

假設這是原始樹,然后添加Z:

    D              D
   / \            / \
  A   S   -->    A   S
     /              / \
    N              N   Z
(size = 4)      (size = 5)

因此,要更新大小,除非我想錯了,否則必須先更新下面的節點,然后才能更新上面的節點。 對? (要更新D,您必須先更新S和A)

那么,您將如何從根到底遍歷卻如何從下而上更新?

我仍然不確定您存儲每個子樹大小的用例是什么,但是很容易在每次插入過程中保持更新,而不必求助於遞歸。 為了簡單起見,讓我們假設您從以下定義開始:

public static class BSTNode
{
    public BSTNode leftTree = null;
    public BSTNode rightTree = null;
    public int subtreeSize = 1;
    public int value;

    public BSTNode(int valToAdd){
        value = valToAdd;
    }
}

public static class BST
{
    public BSTNode root;

    //public void insert(int valToAdd)
}

insert的實現中,我們將從根開始並遍歷樹以找到添加新值的適當位置。 我們可以隨時更新每個子樹的大小。 一個簡單的實現可能如下所示:

public void insert(int valToAdd)
{
    if(root == null){
        root = new BSTNode(valToAdd);
        return;
    }

    BSTNode parent = root;
    BSTNode current = root;
    while(current != null){
        parent = current;
        ++current.subtreeSize;
        if(valToAdd <= current.value){
            current = current.leftTree;
        }
        else{
            current = current.rightTree;                
        }
    }

    if(valToAdd <= parent.value){
        parent.leftTree = new BSTNode(valToAdd);
    }
    else{
        parent.rightTree = new BSTNode(valToAdd);
    }
}

在某些情況下,您想從底部開始進行更新,例如跟蹤子樹的高度(可用於重新平衡)。 假設現在BSTNode定義為:

public static class BSTNode
{
    public BSTNode leftTree = null;
    public BSTNode rightTree = null;
    public int height = 0;
    public int value;

    public BSTNode(int valToAdd){
        value = valToAdd;
    }
}

insert ,使用Stack (或任何可以提供LIFO語義的東西)來存儲新插入節點的祖先。 修改我們之前的簡單示例:

public void insert(int valToAdd)
{
    if(root == null){
        root = new BSTNode(valToAdd);
        return;
    }

    java.util.Stack<BSTNode> stack = new java.util.Stack<BSTNode>();

    BSTNode parent = root;
    BSTNode current = root;
    while(current != null){
        parent = current;
        stack.push(current);
        if(valToAdd <= current.value){
            current = current.leftTree;
        }
        else{
            current = current.rightTree;                
        }
    }

    if(valToAdd <= parent.value){
        parent.leftTree = new BSTNode(valToAdd);
    }
    else{
        parent.rightTree = new BSTNode(valToAdd);
    }

    int height = 1;
    while(!stack.isEmpty()){
        current = stack.pop();
        current.height = Math.max(height, current.height);
        ++height;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM