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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java实现简单二叉树

發(fā)布時間:2025/3/12 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java实现简单二叉树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

二叉樹基本知識:

一、樹的定義

樹是一種數(shù)據(jù)結構,它是由n(n>=1)個有限結點組成一個具有層次關系的集合。

樹具有的特點有:

(1)每個結點有零個或多個子結點

(2)沒有父節(jié)點的結點稱為根節(jié)點

(3)每一個非根結點有且只有一個父節(jié)點

(4)除了根結點外,每個子結點可以分為多個不相交的子樹。

樹的基本術語有:

若一個結點有子樹,那么該結點稱為子樹根的“雙親”,子樹的根稱為該結點的“孩子”。有相同雙親的結點互為“兄弟”。一個結點的所有子樹上的任何結點都是該結點的后裔。從根結點到某個結點的路徑上的所有結點都是該結點的祖先

結點的度:結點擁有的子樹的數(shù)目

葉子結點:度為0的結點

分支結點:度不為0的結點

樹的度:樹中結點的最大的度

層次:根結點的層次為1,其余結點的層次等于該結點的雙親結點的層次加1

樹的高度:樹中結點的最大層次

森林:0個或多個不相交的樹組成。對森林加上一個根,森林即成為樹;刪去根,樹即成為森林。

二、二叉樹

1、二叉樹的定義

二叉樹是每個結點最多有兩個子樹的樹結構。它有五種基本形態(tài):二叉樹可以是空集;根可以有空的左子樹或右子樹;或者左、右子樹皆為空。

2、二叉樹的性質

性質1:二叉樹第i層上的結點數(shù)目最多為2i-1(i>=1)

性質2:深度為k的二叉樹至多有2k-1個結點(k>=1)

性質3:包含n個結點的二叉樹的高度至少為(log2n)+1

性質4:在任意一棵二叉樹中,若終端結點的個數(shù)為n0,度為2的結點數(shù)為n2,則n0=n2+1

3、性質4的證明

性質4:在任意一棵二叉樹中,若終端結點的個數(shù)為n0,度為2的結點數(shù)為n2,則n0=n2+1

證明:因為二叉樹中所有結點的度數(shù)均不大于2,不妨設n0表示度為0的結點個數(shù),n1表示度為1的結點個數(shù),n2表示度為2的結點個數(shù)。三類結點加起來為總結點個數(shù),于是便可得到:n=n0+n1+n2 (1)

由度之間的關系可得第二個等式:n=n00+n11+n2*2+1即n=n1+2n2+1 (2)

將(1)(2)組合在一起可得到n0=n2+1

三、滿二叉樹、完全二叉樹和二叉查找樹

1、滿二叉樹

定義:高度為h,并且由2h-1個結點組成的二叉樹,稱為滿二叉樹

2、完全二叉樹

定義:一棵二叉樹中,只有最下面兩層結點的度可以小于2,并且最下層的葉結點集中在靠左的若干位置上,這樣的二叉樹稱為完全二叉樹。

特點:葉子結點只能出現(xiàn)在最下層和次下層,且最下層的葉子結點集中在樹的左部。顯然,一棵滿二叉樹必定是一棵完全二叉樹,而完全二叉樹未必是滿二叉樹。

面試題:如果一個完全二叉樹的結點總數(shù)為768個,求葉子結點的個數(shù)。

由二叉樹的性質知:n0=n2+1,將之帶入768=n0+n1+n2中得:768=n1+2n2+1,因為完全二叉樹度為1的結點個數(shù)要么為0,要么為1,那么就把n1=0或者1都代入公式中,很容易發(fā)現(xiàn)n1=1才符合條件。所以算出來n2=383,所以葉子結點個數(shù)n0=n2+1=384。

總結規(guī)律:如果一棵完全二叉樹的結點總數(shù)為n,那么葉子結點等于n/2(當n為偶數(shù)時)或者(n+1)/2(當n為奇數(shù)時)

3、二叉查找樹

定義:二叉查找樹又被稱為二叉搜索樹。設x為二叉查找樹中的一個結點,x結點包含關鍵字key,結點x的key值計為key[x]。如果y是x的左子樹中的一個結點,則key[y]<=key[x];如果y是x的右子樹的一個結點,則key[y]>=key[x]

在二叉查找樹種:

(1)若任意結點的左子樹不空,則左子樹上所有結點的值均小于它的根結點的值。

(2)任意結點的右子樹不空,則右子樹上所有結點的值均大于它的根結點的值。

(3)任意結點的左、右子樹也分別為二叉查找樹。

(4)沒有鍵值相等的結點。

要求:將一個數(shù)組中的數(shù)以二叉樹的存儲結構存儲,并遍歷打印。

import java.util.ArrayList; import java.util.List;public class bintree {public bintree left;public bintree right;public bintree root; // 數(shù)據(jù)域private Object data;// 存節(jié)點public List<bintree> datas;public bintree(bintree left, bintree right, Object data){this.left=left;this.right=right;this.data=data;} // 將初始的左右孩子值為空public bintree(Object data){this(null,null,data);}public bintree() {}public void creat(Object[] objs){datas=new ArrayList<bintree>();// 將一個數(shù)組的值依次轉換為Node節(jié)點for(Object o:objs){datas.add(new bintree(o));} // 第一個數(shù)為根節(jié)點root=datas.get(0); // 建立二叉樹for (int i = 0; i <objs.length/2; i++) { // 左孩子datas.get(i).left=datas.get(i*2+1); // 右孩子if(i*2+2<datas.size()){//避免偶數(shù)的時候 下標越界datas.get(i).right=datas.get(i*2+2);}}} //先序遍歷 public void preorder(bintree root){if(root!=null){System.out.println(root.data);preorder(root.left);preorder(root.right);} } //中序遍歷public void inorder(bintree root){if(root!=null){inorder(root.left);System.out.println(root.data);inorder(root.right);}} // 后序遍歷public void afterorder(bintree root){if(root!=null){System.out.println(root.data);afterorder(root.left);afterorder(root.right);}}public static void main(String[] args) {bintree bintree=new bintree();Object []a={2,4,5,7,1,6,12,32,51,22};bintree.creat(a);bintree.preorder(bintree.root);} }

要求:從鍵盤輸入數(shù),存為二叉樹結構并打印。

import java.util.Scanner;public class btree {private btree left,right;private char data;public btree creat(String des){Scanner scanner=new Scanner(System.in);System.out.println("des:"+des);String str=scanner.next();if(str.charAt(0)<'a')return null;btree root=new btree();root.data=str.charAt(0);root.left=creat(str.charAt(0)+"左子樹");root.right=creat(str.charAt(0)+"右子樹");return root;}public void midprint(btree btree){ // 中序遍歷if(btree!=null){midprint(btree.left);System.out.print(btree.data+" ");midprint(btree.right);}}public void firprint(btree btree){ // 先序遍歷if(btree!=null){System.out.print(btree.data+" ");firprint(btree.left);firprint(btree.right);}}public void lastprint(btree btree){ // 后序遍歷if(btree!=null){lastprint(btree.left);lastprint(btree.right);System.out.print(btree.data+" ");}}public static void main(String[] args) {btree tree = new btree();btree newtree=tree.creat("根節(jié)點");tree.firprint(newtree);System.out.println();tree.midprint(newtree);System.out.println();tree.lastprint(newtree);} }

輸出結果:

des:根節(jié)點
a
des:a左子樹
e
des:e左子樹
c
des:c左子樹
1
des:c右子樹
1
des:e右子樹
b
des:b左子樹

1
des:b右子樹
1
des:a右子樹
d
des:d左子樹
f
des:f左子樹
1
des:f右子樹
1
des:d右子樹
1
a e c b d f 先序
c e b a f d 中序
c b e f d a 后序

二叉樹的遍歷次序:

前序順序是根節(jié)點排最先,然后同級先左后右;中序順序是先左后根最后右;后序順序是先左后右最后根。

例如:

比如上圖二叉樹遍歷結果

前序遍歷:ABCDEFGHK

中序遍歷:BDCAEHGKF

后序遍歷:DCBHKGFEA

分析中序遍歷如下圖,中序比較重要(java很多樹排序是基于中序,后面講解分析)


總結

以上是生活随笔為你收集整理的java实现简单二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。

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