program strom;
type uk=^tree;
tree = record
data:integer;
left:^tree;
right:^tree;
end;
var root:^tree;
procedure insert0(x:integer);
var p:uk;
begin
new(p);
p^.data:=x;
p^.left:=nil;
p^.right:=nil;
root:=p;
end;
procedure insert (x:integer);
var p,z:uk;
begin
p:=root;
z:=nil;
while (p<>nil) and (p^.data<>x) do begin
z:=p;
if p^.data > x then
p:=p^.left
else
p:=p^.right;
end;
if p=nil then begin
new (p);
p^.data:=x;
p^.left:=nil;
p^.right:=nil;
if z = nil then root := p
else if x < z^.data then z^.left := p
else z^.right:=p;
end;
end;
procedure enter (var p: uk; x:integer);
begin
if p = nil then
begin
new (p);
p^.data := x;
p^.left := nil;
p^.right := nil;
end
else if p^.data = x then
(* duplicita *)
else if x < p^.data then
enter (p^.left, x)
else
enter (p^.right, x)
end;
procedure store (x:integer);
var p:^uk;
begin
p:=addr (root);
while (p^<>nil) and (p^^.data<>x) do
if p^^.data > x then
p := addr (p^^.left)
else
p:= addr (p^^.right);
if p^=nil then begin
new (p^);
p^^.data:=x;
p^^.left:=nil;
p^^.right:=nil;
end;
end;
function search(x:integer):uk;
var p:uk;
begin
p:=root;
while (p<>nil) and (p^.data<>x) do
begin
if p^.data > x then
p:=p^.left
else
p:=p^.right;
end;
result:=p;
end;
function find(p: uk; x:integer):uk;
begin
if p = nil then
result := nil
else if p^.data = x then
result := p
else if x < p^.data then
result := find (p^.left, x)
else
result := find (p^.right, x)
end;
function select(var r: uk): uk;
begin
if r^.right<>nil then
result := select (r^.right)
else begin
result := r; // drive nez r zmenim
r := r^.left;
// result^.left zatim obsahuje starou hodnotu, kterou prepiseme
end;
end;
procedure remove(var p: uk; x:integer);
var t, f: uk;
begin
if p=nil then
// x neni ve stromu
else if x<p^.data then
remove(p^.left,x)
else if x>p^.data then
remove(p^.right,x)
else begin
t:=p;
if (p^.left=nil) and (p^.right=nil) then
p:=nil
else if p^.right=nil then //pouze levĂ˝ strom
p:=p^.left
else if p^.left=nil then
p:=p^.right
else begin
f:=select(p^.left);
p:=f;
p^.left:=t^.left;
p^.right:=t^.right;
end;
dispose (t);
end
end;
procedure zobraz (p:uk; level: integer = 1);
begin
if p <> nil then begin
zobraz (p^.left, level+1);
writeln (' ' : 4*level, p^.data);
zobraz (p^.right, level+1);
end;
end;
begin
root := nil;
enter (root, 10);
enter (root, 5);
enter (root, 7);
enter (root, 12);
remove (root, 10);
tisk (root);
writeln;
zobraz (root);
readln;
end.
private void jTree1ValueChanged(javax.swing.event.TreeSelectionEvent evt)
{
TreePath [] paths = evt.getPaths();
if (paths.length == 1)
{
TreePath p = paths [0];
Object obj = p.getLastPathComponent();
if (obj instanceof MyNode)
{
MyNode node = (MyNode) obj;
jButton1.setText (node.path);
}
}
}
package stromecek;
import javax.swing.*;
import javax.swing.tree.*;
import java.io.*;
public class MyNode extends DefaultMutableTreeNode
{
public String path;
public boolean scanned = false;
public MyNode (String p)
{
super (p);
path = p;
}
}
MyNode root = new MyNode ("abc");
DefaultTreeModel m = new DefaultTreeModel (root);
private void showDir (MyNode above, String path, int level)
{
File dir = new File (path);
String [] array = dir.list();
above.scanned = true;
if (array != null)
for (String s : array)
{
MyNode node = new MyNode (s);
node.path = path + "\\" + s;
above.add(node);
m.nodesWereInserted (above, new int [] {above.getIndex(node)});
if (level > 1)
{
File f = new File (path + "\\" + s);
if (f.isDirectory())
showDir(node, path+ "\\" + s, level-1);
}
}
}
private void rescanDir (MyNode above, int level)
{
if (above.scanned)
{
if (level > 1)
{
int cnt = above.getChildCount();
for (int i = 0; i < cnt; i++)
{
TreeNode tn = above.getChildAt(i);
if (tn instanceof MyNode)
{
MyNode node = (MyNode) tn;
rescanDir(node, level-1);
}
}
}
}
else
{
showDir (above, above.path, level);
}
}
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
showDir (root, "c:\\Program Files", 2);
}