[英]Write a non-recursive traversal of a Binary Search Tree using constant space and O(n) run time
[英]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.