本案例需要完成的任务定义如下:实现一个二叉树,实现增加节点和树的遍历等功能。
定义“二叉树”节点:
对于树节点,关键要素是节点自身数值data、左子节点left和右子节点right。
public class TNode {
//元素类型为int的节点
private int data;
private TNode left;
private TNode right;
//定义构造器
public TNode(int i, TNode lft, TNode rt){
data = i;
left = lft;
right =rt;
}
public TNode(int i){
this(i,null,null);
}
public TNode(){
this(0,null,null);
}
//更改节点数值
public void setData(int i){
data = i;
}
//读取节点数值
public int getData(){
return data;
}
//更改left子节点
public void setLeft(TNode tn){
left = tn;
}
//读取left子节点
public TNode getLeft(){
return left;
}
//更改right子节点
public void setRight(TNode tn){
right = tn;
}
//读取right子节点
public TNode getRight(){
return right;
}
//打印节点的值
public void printTNode(){
System.out.print(data+"->");
}
}实现“二叉树”的遍历:
应用递归实现二叉树遍历是很好的思路。遍历的方法按照顺序不同可分为前序遍历、中序遍历和后序遍历,分别表示最先遍历父节点(顺序:父节点->left节点->right节点)、中间遍历父节点和最后遍历父节点。本例采用前序遍历。
package tree;
public class BinaryTree {
//树的基本元素:根节点
TNode root;
//构造器:指定根节点
public BinaryTree(TNode rt){
root = rt;
}
public BinaryTree(){
root = null;
}
//开始递归遍历,采用前序遍历
public void traverseTree(TNode rt){
if(rt!=null)
rt.printTNode();
if(rt.getLeft()!=null)
traverseTree(rt.getLeft());
if(rt.getRight()!=null)
traverseTree(rt.getRight());
}
//在树中增加节点tn,指定相应的父节点father;
public void addTNode(TNode tn,TNode father){
//当子节点数量少于或等于1时允许插入tn,插入顺序先left后right
if(father == null){
father = tn;
}
if(father.getLeft()==null){
father.setLeft(tn);
}
else if(father.getRight()==null){
father.setRight(tn);
}
else{
System.out.println("illegal, already have two child nodes!");
}
}
}
测试程序:
测试了生成二叉树、增加子节点以及遍历二叉树等功能,运行正常。
package tree;
public class TraverseTree {
public static void main(String[] args) {
// TODO Auto-generated method stub
TNode root = new TNode(99);
BinaryTree btr = new BinaryTree(root);
TNode tn1 = new TNode(1);
TNode tn2 = new TNode(2);
TNode tn3 = new TNode(3);
TNode tn4 = new TNode(4);
btr.addTNode(tn1, root);
btr.addTNode(tn2, root);
btr.addTNode(tn3, tn1);
btr.addTNode(tn4, tn1);
btr.traverseTree(root);
}
}
浙公网安备 33010602011771号