二叉樹的幾種遍歷(遞迴,非遞迴)JAVA實現

2021-07-27 22:34:38 字數 2489 閱讀 8965

首先二叉樹是樹形結構的一種特殊型別,它符合樹形結構的所有特點。本篇部落格會針對二叉樹來介紹一些樹的基本概念,二叉樹的基本操作(儲存,返回樹的深度,節點個數,每一層的節點個數),二叉樹的四種遍歷(層次,先序,中序,後序)

一.基本概念

二叉樹有5種基本形態:

注:二叉樹有序樹,就是說乙個節點的左右節點是有大小之分的,我們通常設定為左孩子一定大於右孩子,下面的實現都是基於這個規則的。

二叉樹分為三種:滿二叉樹,完全二叉樹,不完全二叉樹

二叉樹的四種遍歷:層次,先序,中序,後序

首先是非遞迴實現上圖的滿二叉樹:

1.先序:根左右,用棧來實現,下面是它的流程圖和入棧出棧的狀態圖(n是每個節點的值) 輸出:12,10,9,11,15,14,16

2.中序:左根右,用棧來實現,中序的堆疊狀態和先序一樣,只是輸出的位置不同,先序在入棧前輸出,中序在出棧後輸出 輸出:9,10,11,12,14,15,16

3.後序:左右根,採用了兩個棧 輸出:9,11,10,14,16,15,12

下面是實現的**:

//建立乙個節點類

class node

//得到資料

public

intgetkey()

}public

class binarytree

else

//葉子節點的if end;

}//左子樹的if end;

else//葉子

}//右子樹}}

}//insert end;

//列印

public

void

printltree(node node)

//深度

public

intheight(node node)

else

}//節點個數

public

intnodenum(node node)

return nodenum(node.leftnode)+nodenum(node.rightnode)+1;

}//第k層節點的個數

public

intgetleafnodenum(node node,int i)

else

else}}

//分層遍歷

public

void

levelorder(node node)

queue.add(node);

while(!queue.isempty())

if(temp.rightnode!=null)}}

//遞迴前序遍歷

public

void

preorder(node node)

}//非遞迴前序遍歷

public

void

npreorder(node node)

else}}

//中序遍歷

public

void

inorder(node node)

}//非遞迴的中序遍歷

public

void

ninorder(node node)

else}}

//後序遍歷

public

void

postorder(node node)

}//非遞迴後序遍歷

public

void

npostorder(node node)

else

}while(!s2.isempty())

}public

static

void

main(string args)

}

**親測可以執行(^-^)v

這些只是二叉樹的一部分內容,希望可以幫助一些初學資料結構的親,如果有錯誤的地方可以幫忙提出來的哦!!

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...

二叉樹的遞迴 非遞迴遍歷

二叉樹的遍歷 2011.8.25 出處 二叉樹的非遞迴遍歷 二叉樹是一種非常重要的資料結構,很多其它資料結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有前序 中序以及後序三種遍歷方法。因為樹的定義本身就是遞迴定義,因此採用遞迴的方法去實現樹的三種遍歷不僅容易理解而且 很簡潔。而對於樹的遍歷若採用非...

二叉樹的遞迴非遞迴遍歷

二叉樹的遍歷一直是常考題,遍歷可以使用遞迴方法也可以使用非遞迴方法。首先先看下遞迴方法。public class node 後序遍歷 public void posorder node head 下面看下非遞迴實現 非遞迴方式實現二叉樹的前序遍歷。借助棧來實現。1,申請乙個棧,記為s,將頭結點hea...