树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构。
基础概念:
如图:(图片参考网络)
根结点:A即是根结点;
父结点(双亲结点):B即是E/F的父结点;
结点的度:结点的分支数量,即结点的子树数,如结点B下面有两个子树,所以度为2,同理A结点度为3,结点度的最大值即是树的度;
结点的权:指的是结点的权重;
叶子结点:没有子结点的结点;
高度:最大的层数,例如上面树的高度为4;
二叉树:任何一个结点的子结点数量<=2,子结点分为左结点和右节点,左右结点不可以随意颠倒位置;
满二叉树:所有叶子结点都在最后一层,且结点总数为2的n次方-1;
完全二叉树:所有叶子结点都在最后一层或者倒数第二层,且最后一层的叶子结点在左边连续,倒数第二层在右边连续;
满二叉树一定是完全二叉树;
前序遍历:自己—左树—右树 A-B-E-K-L-F-C-G-D-H-M-I-J
中序遍历:左树—自己—右树 ~
后序遍历:左树—右树—自己 ~
代码实现:
public class TreeNode{ //结点类
int value;
TreeNode left;
TreeNode right;
public TreeNode(int value){
this.value=value;
}
public void setlnode(TreeNode left){
this.left=left;
}
public void setrnode(TreeNode right){
this.right=right;
}
public void frontshow(){
System.out.println(value);
if(left!=null){
left.frontshow();
}
f(right!=null){
right.frontshow();
}
}
public TreeNode frontSearch(int i){
if(this.value==i){
return this;
}else{
if(left!=null)
TreeNode target=left.frontSearch(i);
if(target!=null)
return target;
if(left!=null)
TreeNode target=right.frontSearch(i);
return target;
}
}
public void delete(int i){
TreeNode parent=this;
if(parent.left.value==i){
parent.left=null;
return;
}
if(parent.right.value==i){
parent.right=null;
return;
}
parent=left;
if(parent!=null)
parent.delete(i);
parent=right;
if(parent!=null)
parent.delete(i);
}
}
public class BinaryTree{ //创建根结点
TreeNode root;
public void setRoot(TreeNode root){
this.root=root;
}
public TreeNode getRoot(){
return root;
}
public void frontshow(){
root.frontshow();
}
public TreeNode frontSearch(int i){
return root.frontSearch(i);
}
public void delete(int i){
if(root.value==i)
root=null;
else
root.delete(i);
}
}
public class TestBinaryTree{
public static void main(String[]args){
BinaryTree binTree=new BinaryTree; //空树
TreeNode root=new TreeNode(1); //根结点
binTree.setRoot(root);
TreeNode rootL=new TreeNode(2);
root.setlnode(rootL);
TreeNode rootR=new TreeNode(3);
root.setrnode(rootR);
}
}