java 树的数据结构_Java数据结构之树(二叉树)
一、概述
1.以二叉樹為例熟悉樹形結構,二叉樹的定義如下:
1.1.二叉樹:是結點有限的集合,這個集合或者是空,或者由一個根結點或兩棵互不相交的稱為左子樹和右子樹的二叉樹組成。
二叉樹是一個遞歸的定義,從中可以推導出另外兩個定義,完全二叉樹和滿二叉樹,分別如下:
1.2.滿二叉樹:2^k-1個結點的深度為K的二叉樹。
1.3. 完全二叉樹:樹的結點對應于相同深度的滿二叉樹,可稱為完全二叉樹。
2.二叉樹的基本操作:
建樹/初始化:將樹置空;
求根結點;
求父節點;
求孩子結點;
求兄弟子樹;
插入子樹;
刪除子樹;
遍歷;
二、鏈式存儲的二叉樹的基本操作以及算法實現
因為順序存儲只適用于滿二叉樹,如果存儲完全二叉樹,會造成空間的大量浪費,比如最壞情況下,k度的完全二叉樹每個節點只有左子樹存在,這樣將有2^k-k-1個節點存儲空值。所以選用鏈表存儲二叉樹更合適。
樹的鏈式存儲結構可抽象出來,Java語言描述如下:
public class TreeNode{
int data;
TreeNode leftNode;
TreeNode rightNode;
public TreeNode(){
}
public TreeNode(int data){
this.data = data;
this.leftNode = null;
this.rightNode = null;
}
public TreeNode(int data,TreeNode leftNode,TreeNode rightNode){
this.data = data;
this.leftNode = leftNode;
this.rightNode = rightNode;
}
}
//實現二叉鏈表結構,建立二叉樹
public TreeNode createTree(){
int data[] = {1,2,0,0,3,4,5,0,6,7,8,0,0,9};
TreeNode tree;
for(int i = 0; i
tree = new TreeNode(data[i]);
tree.leftNode = createTree();
tree.rightNode = createTree();
}
return tree;
}
2.1.二叉樹的遍歷操作
如果遵循先左后右的規則,那么二叉樹的遍歷方法可分為三種:先根序遍歷;中根序遍歷;后根序遍歷。
//先根序的遞歸方法遍歷
public void disp(TreeNode tree){
if(tree != null){
System.out.print(tree.data);
disp(tree.leftNode);
disp(tree.rightNode);
}
}
//中根序的遞歸方法遍歷
public void disp(TreeNode tree){
if(tree != null){
disp(tree.leftNode);
System.out.print(tree.data);
disp(tree.rightNode);
}
}
//后根序的遞歸方法遍歷
public void disp(TreeNode tree){
if(tree != null){
disp(tree.rightNode);
System.out.print(tree.data+" ");
disp(tree.leftNode);
}
}
這里可以借助棧的作用將此遞歸方法的遍歷算法改為非遞歸方法,降低其時間復雜度,以先根序遍歷算法為例,其基本思路為:從根結點走向左子樹之前,將根結點的指針入棧保存,遍歷完左子樹之后,在將根結點指針出棧,得到根結點地址之后走向右結點,然后遍歷右子樹。
//建立棧用來保存根結點指針
public class Stack{
public final int MAXSIZE= 100;
public int elem[] ;
public int top;
public Stack(){
this.top = 0;
this.elem = new int[maxsize];
}
}
//遍歷算法
public void disp(TreeNode tree){
Stack stack = new Stack();
final int MAXSIZE = stack.MAXSIZE;
do{
while(tree != null){
System.out.print(tree.data+" ");
if(stack.top==MAXSIZE){
System.out.print("stack is overflow");
return;
}
stack.push( tree);
tree = tree.leftNode;
}
if(stack.top != 0){
//取出跟指針并移向右子樹
tree =stack.pop().rightNode;
}
}while(stack.top != 0|| tree != null);//棧非空或子樹非空
}
總結
以上是生活随笔為你收集整理的java 树的数据结构_Java数据结构之树(二叉树)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pg数据库开启远程连接_疫情之下,开启在
- 下一篇: d630无电池升级bios_太重要,你想