核心:树中每个节点最多只能有两个子节点(t>=0&&t<=2)
下面实现的是一个二叉排序树(左孩子小于父节点,右孩子大于父节点)
1.插入节点
核心思想:
(1)如果不存在节点,则直接插入。
(2)从根节点开始查找一个相应的节点,即新节点的父节点,当父节点找到后,根据新节点的值来确定新节点是连接到左子节点还是右子节点。
2.查找节点
核心思想:
从根节点开始查找,如果查找到节点值比父节点值要小,则查找其左子树,否则查找其右子树,直到查找到为止,如果不存在节点,则返回null
3.修改节点
核心思想:首先查找节点,找到相应节点后,再进行修改(关键字不要进行修改)。
4.遍历二叉树
遍历二叉树分为三种方法:先序遍历,中序遍历,后序遍历。
先序遍历:访问节点,遍历节点的左子树,遍历节点的右子树。
中序遍历:遍历节点的左子树,访问节点,遍历节点的右子树。
后序遍历:遍历节点的左子树,遍历节点的右子树,访问节点。
树的每个节点模型:
二叉树的模型:
遍历测试:
转载请注明出处:http://blog.youkuaiyun.com/acmman/article/details/50487767
下面实现的是一个二叉排序树(左孩子小于父节点,右孩子大于父节点)
1.插入节点
核心思想:
(1)如果不存在节点,则直接插入。
(2)从根节点开始查找一个相应的节点,即新节点的父节点,当父节点找到后,根据新节点的值来确定新节点是连接到左子节点还是右子节点。
2.查找节点
核心思想:
从根节点开始查找,如果查找到节点值比父节点值要小,则查找其左子树,否则查找其右子树,直到查找到为止,如果不存在节点,则返回null
3.修改节点
核心思想:首先查找节点,找到相应节点后,再进行修改(关键字不要进行修改)。
4.遍历二叉树
遍历二叉树分为三种方法:先序遍历,中序遍历,后序遍历。
先序遍历:访问节点,遍历节点的左子树,遍历节点的右子树。
中序遍历:遍历节点的左子树,访问节点,遍历节点的右子树。
后序遍历:遍历节点的左子树,遍历节点的右子树,访问节点。
树的每个节点模型:
package cn.edu.Tree;
public class Node {
//关键字
private int keyData;
//其他数据
private int otherData;
//左子节点
private Node leftNode;
//右子节点
private Node rightNode;
public Node(int keyData, int otherData) {
super();
this.keyData = keyData;
this.otherData = otherData;
}
public int getKeyData() {
return keyData;
}
public void setKeyData(int keyData) {
this.keyData = keyData;
}
public int getOtherData() {
return otherData;
}
public void setOtherData(int otherData) {
this.otherData = otherData;
}
public Node getLeftNode() {
return leftNode;
}
public void setLeftNode(Node leftNode) {
this.leftNode = leftNode;
}
public Node getRightNode() {
return rightNode;
}
public void setRightNode(Node rightNode) {
this.rightNode = rightNode;
}
//显示方法
public void display(){
System.out.println(this.keyData+" "+this.otherData);
}
}
二叉树的模型:
package cn.edu.Tree;
public class Tree {
//根
private Node root=null;
//插入方法
public void insert(int keyData,int otherData){
Node newNode=new Node(keyData,otherData);
//如果说没有节点
if(root==null){
root=newNode;
}else{
Node current=root;
Node parent;
while(true){
parent=current;
if(keyData<current.getKeyData()){
current=current.getLeftNode();
if(current==null){
parent.setLeftNode(newNode);
break;
}
}else{
current=current.getRightNode();
if(current==null){
parent.setRightNode(newNode);
break;
}
}
}
}
}
//查找方法
public Node find(int keyData){
Node current=root;
while(current.getKeyData()!=keyData){
if(keyData<current.getKeyData()){
current=current.getLeftNode();
}else{
current=current.getRightNode();
}
if(current==null){
return null;
}
}
return current;
}
//删除方法
public void delete(int keyData){
}
//修改方法
public void change(int keyData,int otherData){
Node findNode=find(keyData);
findNode.setOtherData(otherData);
}
//先序遍历
public void preOrder(Node node){
if(node!=null){
node.display();
preOrder(node.getLeftNode());
preOrder(node.getRightNode());
}
}
//中序遍历
public void inOrder(Node node){
if(node!=null){
inOrder(node.getLeftNode());
node.display();
inOrder(node.getRightNode());
}
}
//后序遍历
public void endOrder(Node node){
if(node!=null){
endOrder(node.getLeftNode());
endOrder(node.getRightNode());
node.display();
}
}
public Node getRoot(){
return this.root;
}
}
遍历测试:
package cn.edu.Tree;
public class TestTree {
public static void main(String[] args) {
Tree tree=new Tree();
tree.insert(80, 80);
tree.insert(49, 49);
tree.insert(42, 42);
tree.insert(30, 30);
tree.insert(45, 45);
tree.insert(90, 90);
tree.insert(150, 150);
tree.insert(130, 130);
tree.insert(82, 82);
tree.preOrder(tree.getRoot());
/* 先序遍历结果
80 80
49 49
42 42
30 30
45 45
90 90
82 82
150 150
130 130
* */
System.out.println("-----------------------");
tree.inOrder(tree.getRoot());
/*中序遍历结果
30 30
42 42
45 45
49 49
80 80
82 82
90 90
130 130
150 150
* */
System.out.println("-----------------------");
tree.endOrder(tree.getRoot());
/*后序遍历结果
30 30
45 45
42 42
49 49
82 82
130 130
150 150
90 90
80 80
* */
/*tree.change(2, 22);
Node findNode=tree.find(2);
findNode.display();*/
}
}
转载请注明出处:http://blog.youkuaiyun.com/acmman/article/details/50487767