遞歸二叉樹java代碼 java非遞歸遍歷二叉樹

Java數據結構二叉樹深度遞歸調用算法求內部算法過程詳解

二叉樹

大邑縣網站制作公司哪家好,找創(chuàng)新互聯建站!從網頁設計、網站建設、微信開發(fā)、APP開發(fā)、響應式網站設計等網站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯建站自2013年起到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創(chuàng)新互聯建站。

1

2

3

4

5

6

7

這個二叉樹的深度是3,樹的深度是最大結點所在的層,這里是3.

應該計算所有結點層數,選擇最大的那個。

根據上面的二叉樹代碼,遞歸過程是:

f

(1)=f

(2)+1

f

(3)

+1

?

f(2)

+

1

:

f(3)

+1

f(2)

跟f(3)計算類似上面,要計算左右結點,然后取大者

所以計算順序是f(4.left)

=

0,

f(4.right)

=

f

(4)

=

f(4.right)

+

1

=

1

然后計算f(5.left)

=

0,f(5.right)

=

f

(5)

=

f(5.right)

+

1

=1

f(2)

=

f(5)

+

1

=2

f(1.left)

計算完畢,計算f(1.right)

f(3)

跟計算f(2)的過程一樣。

得到f(3)

=

f(7)

+1

=

2

f(1)

=

f(3)

+

1

=3

12345if(depleftdepright){ return depleft+1;}else{ return depright+1;}

只有l(wèi)eft大于right的時候采取left

+1,相等是取right

假設二叉樹以二叉鏈表作為存儲結構,試設計一個計算二叉樹葉子結點樹的遞歸算 法 要求用遞歸算法啊

1、首先要定義兩個類:結點類和二叉樹類。

2、二叉樹類的組成:建立樹的函數、遍歷函數、刪除函數。求結點數函數。

3、采用遞歸的思想,遇到標識符表示該結點為空,否則開辟空間創(chuàng)建新結點,同時調用遞歸開辟左結點和右結點。

4、前序遍歷函數。

5、刪除函數的思路:如果當前結點不為空,采用遞歸訪問左結點和右結點、回收當前結點的空間。

6、求結點數函數的思路:如果當前結點為空,返回0、如果當前結點的左右孩子都為空,放回1。

7、求樹高函數的思路:如果當前結點為空,返回0、遞歸訪問左孩子和右孩子、比較左右孩子的高度,返回 較大值+1。

java構建二叉樹算法

//******************************************************************************************************//

//*****本程序包括簡單的二叉樹類的實現和前序,中序,后序,層次遍歷二叉樹算法,*******//

//******以及確定二叉樹的高度,制定對象在樹中的所處層次以及將樹中的左右***********//

//******孩子節(jié)點對換位置,返回葉子節(jié)點個數刪除葉子節(jié)點,并輸出所刪除的葉子節(jié)點**//

//*******************************CopyRight By phoenix*******************************************//

//************************************Jan 12,2008*************************************************//

//****************************************************************************************************//

public class BinTree {

public final static int MAX=40;

private Object data; //數據元數

private BinTree left,right; //指向左,右孩子結點的鏈

BinTree []elements = new BinTree[MAX];//層次遍歷時保存各個節(jié)點

int front;//層次遍歷時隊首

int rear;//層次遍歷時隊尾

public BinTree()

{

}

public BinTree(Object data)

{ //構造有值結點

this.data = data;

left = right = null;

}

public BinTree(Object data,BinTree left,BinTree right)

{ //構造有值結點

this.data = data;

this.left = left;

this.right = right;

}

public String toString()

{

return data.toString();

}//前序遍歷二叉樹

public static void preOrder(BinTree parent){

if(parent == null)

return;

System.out.print(parent.data+" ");

preOrder(parent.left);

preOrder(parent.right);

}//中序遍歷二叉樹

public void inOrder(BinTree parent){

if(parent == null)

return;

inOrder(parent.left);

System.out.print(parent.data+" ");

inOrder(parent.right);

}//后序遍歷二叉樹

public void postOrder(BinTree parent){

if(parent == null)

return;

postOrder(parent.left);

postOrder(parent.right);

System.out.print(parent.data+" ");

}// 層次遍歷二叉樹

public void LayerOrder(BinTree parent)

{

elements[0]=parent;

front=0;rear=1;

while(frontrear)

{

try

{

if(elements[front].data!=null)

{

System.out.print(elements[front].data + " ");

if(elements[front].left!=null)

elements[rear++]=elements[front].left;

if(elements[front].right!=null)

elements[rear++]=elements[front].right;

front++;

}

}catch(Exception e){break;}

}

}//返回樹的葉節(jié)點個數

public int leaves()

{

if(this == null)

return 0;

if(left == nullright == null)

return 1;

return (left == null ? 0 : left.leaves())+(right == null ? 0 : right.leaves());

}//結果返回樹的高度

public int height()

{

int heightOfTree;

if(this == null)

return -1;

int leftHeight = (left == null ? 0 : left.height());

int rightHeight = (right == null ? 0 : right.height());

heightOfTree = leftHeightrightHeight?rightHeight:leftHeight;

return 1 + heightOfTree;

}

//如果對象不在樹中,結果返回-1;否則結果返回該對象在樹中所處的層次,規(guī)定根節(jié)點為第一層

public int level(Object object)

{

int levelInTree;

if(this == null)

return -1;

if(object == data)

return 1;//規(guī)定根節(jié)點為第一層

int leftLevel = (left == null?-1:left.level(object));

int rightLevel = (right == null?-1:right.level(object));

if(leftLevel0rightLevel0)

return -1;

levelInTree = leftLevelrightLevel?rightLevel:leftLevel;

return 1+levelInTree;

}

//將樹中的每個節(jié)點的孩子對換位置

public void reflect()

{

if(this == null)

return;

if(left != null)

left.reflect();

if(right != null)

right.reflect();

BinTree temp = left;

left = right;

right = temp;

}// 將樹中的所有節(jié)點移走,并輸出移走的節(jié)點

public void defoliate()

{

String innerNode = "";

if(this == null)

return;

//若本節(jié)點是葉節(jié)點,則將其移走

if(left==nullright == null)

{

System.out.print(this + " ");

data = null;

return;

}

//移走左子樹若其存在

if(left!=null){

left.defoliate();

left = null;

}

//移走本節(jié)點,放在中間表示中跟移走...

innerNode += this + " ";

data = null;

//移走右子樹若其存在

if(right!=null){

right.defoliate();

right = null;

}

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

BinTree e = new BinTree("E");

BinTree g = new BinTree("G");

BinTree h = new BinTree("H");

BinTree i = new BinTree("I");

BinTree d = new BinTree("D",null,g);

BinTree f = new BinTree("F",h,i);

BinTree b = new BinTree("B",d,e);

BinTree c = new BinTree("C",f,null);

BinTree tree = new BinTree("A",b,c);

System.out.println("前序遍歷二叉樹結果: ");

tree.preOrder(tree);

System.out.println();

System.out.println("中序遍歷二叉樹結果: ");

tree.inOrder(tree);

System.out.println();

System.out.println("后序遍歷二叉樹結果: ");

tree.postOrder(tree);

System.out.println();

System.out.println("層次遍歷二叉樹結果: ");

tree.LayerOrder(tree);

System.out.println();

System.out.println("F所在的層次: "+tree.level("F"));

System.out.println("這棵二叉樹的高度: "+tree.height());

System.out.println("--------------------------------------");

tree.reflect();

System.out.println("交換每個節(jié)點的孩子節(jié)點后......");

System.out.println("前序遍歷二叉樹結果: ");

tree.preOrder(tree);

System.out.println();

System.out.println("中序遍歷二叉樹結果: ");

tree.inOrder(tree);

System.out.println();

System.out.println("后序遍歷二叉樹結果: ");

tree.postOrder(tree);

System.out.println();

System.out.println("層次遍歷二叉樹結果: ");

tree.LayerOrder(tree);

System.out.println();

System.out.println("F所在的層次: "+tree.level("F"));

System.out.println("這棵二叉樹的高度: "+tree.height());

}

用java怎么構造一個二叉樹呢?

java構造二叉樹,可以通過鏈表來構造,如下代碼:

public?class?BinTree?{

public?final?static?int?MAX=40;

BinTree?[]elements?=?new?BinTree[MAX];//層次遍歷時保存各個節(jié)點

int?front;//層次遍歷時隊首

int?rear;//層次遍歷時隊尾

private?Object?data;?//數據元數

private?BinTree?left,right;?//指向左,右孩子結點的鏈

public?BinTree()

{

}

public?BinTree(Object?data)

{?//構造有值結點

this.data?=?data;

left?=?right?=?null;

}

public?BinTree(Object?data,BinTree?left,BinTree?right)

{?//構造有值結點

this.data?=?data;

this.left?=?left;

this.right?=?right;

}

public?String?toString()

{

return?data.toString();

}

//前序遍歷二叉樹

public?static?void?preOrder(BinTree?parent){?

if(parent?==?null)

return;

System.out.print(parent.data+"?");

preOrder(parent.left);

preOrder(parent.right);

}

//中序遍歷二叉樹

public?void?inOrder(BinTree?parent){

if(parent?==?null)

return;

inOrder(parent.left);

System.out.print(parent.data+"?");

inOrder(parent.right);

}

//后序遍歷二叉樹

public?void?postOrder(BinTree?parent){

if(parent?==?null)

return;

postOrder(parent.left);

postOrder(parent.right);

System.out.print(parent.data+"?");

}

//?層次遍歷二叉樹?

public?void?LayerOrder(BinTree?parent)

{?

elements[0]=parent;

front=0;rear=1;

while(frontrear)

{

try

{

if(elements[front].data!=null)

{

System.out.print(elements[front].data?+?"?");

if(elements[front].left!=null)

elements[rear++]=elements[front].left;

if(elements[front].right!=null)

elements[rear++]=elements[front].right;

front++;

}

}catch(Exception?e){break;}

}

}

//返回樹的葉節(jié)點個數

public?int?leaves()

{

if(this?==?null)

return?0;

if(left?==?nullright?==?null)

return?1;

return?(left?==?null???0?:?left.leaves())+(right?==?null???0?:?right.leaves());

}

//結果返回樹的高度

public?int?height()

{

int?heightOfTree;

if(this?==?null)

return?-1;

int?leftHeight?=?(left?==?null???0?:?left.height());

int?rightHeight?=?(right?==?null???0?:?right.height());

heightOfTree?=?leftHeightrightHeight?rightHeight:leftHeight;

return?1?+?heightOfTree;

}

//如果對象不在樹中,結果返回-1;否則結果返回該對象在樹中所處的層次,規(guī)定根節(jié)點為第一層

public?int?level(Object?object)

{

int?levelInTree;

if(this?==?null)

return?-1;

if(object?==?data)

return?1;//規(guī)定根節(jié)點為第一層

int?leftLevel?=?(left?==?null?-1:left.level(object));

int?rightLevel?=?(right?==?null?-1:right.level(object));

if(leftLevel0rightLevel0)

return?-1;

levelInTree?=?leftLevelrightLevel?rightLevel:leftLevel;

return?1+levelInTree;

}

//將樹中的每個節(jié)點的孩子對換位置

public?void?reflect()

{

if(this?==?null)

return;

if(left?!=?null)

left.reflect();

if(right?!=?null)

right.reflect();

BinTree?temp?=?left;

left?=?right;

right?=?temp;

}

//?將樹中的所有節(jié)點移走,并輸出移走的節(jié)點

public?void?defoliate()

{

if(this?==?null)

return;

//若本節(jié)點是葉節(jié)點,則將其移走

if(left==nullright?==?null)

{

System.out.print(this?+?"?");

data?=?null;

return;

}

//移走左子樹若其存在

if(left!=null){

left.defoliate();

left?=?null;

}

//移走本節(jié)點,放在中間表示中跟移走...

String?innerNode?+=?this?+?"?";

data?=?null;

//移走右子樹若其存在

if(right!=null){

right.defoliate();

right?=?null;

}

}

/**

*?@param?args

*/

public?static?void?main(String[]?args)?{

//?TODO?Auto-generated?method?stub

BinTree?e?=?new?BinTree("E");

BinTree?g?=?new?BinTree("G");

BinTree?h?=?new?BinTree("H");

BinTree?i?=?new?BinTree("I");

BinTree?d?=?new?BinTree("D",null,g);

BinTree?f?=?new?BinTree("F",h,i);

BinTree?b?=?new?BinTree("B",d,e);

BinTree?c?=?new?BinTree("C",f,null);

BinTree?tree?=?new?BinTree("A",b,c);

System.out.println("前序遍歷二叉樹結果:?");

tree.preOrder(tree);

System.out.println();

System.out.println("中序遍歷二叉樹結果:?");

tree.inOrder(tree);

System.out.println();

System.out.println("后序遍歷二叉樹結果:?");

tree.postOrder(tree);

System.out.println();

System.out.println("層次遍歷二叉樹結果:?");

tree.LayerOrder(tree);

System.out.println();

System.out.println("F所在的層次:?"+tree.level("F"));

System.out.println("這棵二叉樹的高度:?"+tree.height());

System.out.println("--------------------------------------");

tree.reflect();

System.out.println("交換每個節(jié)點的孩子節(jié)點后......");

System.out.println("前序遍歷二叉樹結果:?");

tree.preOrder(tree);

System.out.println();

System.out.println("中序遍歷二叉樹結果:?");

tree.inOrder(tree);

System.out.println();

System.out.println("后序遍歷二叉樹結果:?");

tree.postOrder(tree);

System.out.println();

System.out.println("層次遍歷二叉樹結果:?");

tree.LayerOrder(tree);

System.out.println();

System.out.println("F所在的層次:?"+tree.level("F"));

System.out.println("這棵二叉樹的高度:?"+tree.height());

}

分享文章:遞歸二叉樹java代碼 java非遞歸遍歷二叉樹
當前路徑:http://muchs.cn/article48/hjcjep.html

成都網站建設公司_創(chuàng)新互聯,為您提供網站營銷、關鍵詞優(yōu)化、網站排名、微信公眾號、外貿網站建設、面包屑導航

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

外貿網站制作