日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 树的数据结构_Java数据结构之树(二叉树)

發布時間:2024/9/27 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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数据结构之树(二叉树)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。