當前位置:首頁 » 編程語言 » java非二叉樹

java非二叉樹

發布時間: 2022-09-08 07:16:43

⑴ 用java實現樹的遍歷 不是二叉樹

不寫代碼 只給思路 :廣度優先遍歷
1。建一個隊列(先進先出),把樹的根節點壓入隊列
2。從隊列中彈出一個節點(第一次彈出的就是根節點),把該節點的所有子節點壓入隊列,如果沒有子節點,說明已經到達葉子節點了
3。重復第二步,直到隊列為空,說明所有的葉子節點都已經經過了隊列,也就完成了遍歷

⑵ java中的二叉樹是什麼意思

二叉樹的相關操作,包括創建,中序、先序、後序(遞歸和非遞歸),其中重點的是java在先序創建二叉樹和後序非遞歸遍歷的的實現。

⑶ 關於java中的二叉樹

感覺你的問題好奇怪

你是怎麼知道node是指向誰的?

既然你知道node指向誰了,那它就可以訪問它裡面的成員變數,leftChild不是它的成員變數嗎?它只要知道它的leftChild存在就行了,leftChild指向誰它不管

////////////////////////////
你的意思是再往下一層?

⑷ java中 遍歷樹的方法一個非二叉樹

可以,查找所有的節點看看沒有父節點就行了。存在父節點的就不是根,而不存在父節點就是根節點。

⑸ 用JAVA語言實現二叉樹的層次遍歷的非遞歸演算法及查找演算法。

先序非遞歸演算法
【思路】
假設:T是要遍歷樹的根指針,若T != NULL
對於非遞歸演算法,引入棧模擬遞歸工作棧,初始時棧為空。
問題:如何用棧來保存信息,使得在先序遍歷過左子樹後,能利用棧頂信息獲取T的右子樹的根指針?
方法1:訪問T->data後,將T入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為T,出棧,再先序遍歷T的右子樹。
方法2:訪問T->data後,將T->rchild入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為T->rchild,出棧,遍歷以該指針為根的子樹。
【演算法1】
void PreOrder(BiTree T, Status ( *Visit ) (ElemType e))

{ // 基於方法一
InitStack(S);
while ( T!=NULL || !StackEmpty(S)){
while ( T != NULL ){
Visit(T->data) ;
Push(S,T);
T = T->lchild;
}
if( !StackEmpty(S) ){
Pop(S,T);
T = T->rchild;
}
}
}
【演算法2】
void PreOrder(BiTree T, Status ( *Visit ) (ElemType e))

{ // 基於方法二
InitStack(S);
while ( T!=NULL || !StackEmpty(S) ){
while ( T != NULL ){
Visit(T->data);
Push(S, T->rchild);
T = T->lchild;
}
if ( !StackEmpty(S) ){
Pop(S,T);
}
}
}
進一步考慮:對於處理流程中的循環體的直到型、當型+直到型的實現。

中序非遞歸演算法
【思路】
T是要遍歷樹的根指針,中序遍歷要求在遍歷完左子樹後,訪問根,再遍歷右子樹。
問題:如何用棧來保存信息,使得在中序遍歷過左子樹後,能利用棧頂信息獲取T指針?
方法:先將T入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為T,出棧,訪問T->data,再中序遍歷T的右子樹。
【演算法】
void InOrder(BiTree T, Status ( *Visit ) (ElemType e))
{
InitStack(S);
while ( T!=NULL || !StackEmpty(S) ){
while ( T != NULL ){
Push(S,T);
T = T->lchild;
}
if( !StackEmpty(S) ){
Pop(S, T);
Visit(T->data);
T = T->rchild;
}
}
}
進一步考慮:對於處理流程中的循環體的直到型、當型+直到型的實現。

後序非遞歸演算法
【思路】
T是要遍歷樹的根指針,後序遍歷要求在遍歷完左右子樹後,再訪問根。需要判斷根結點的左右子樹是否均遍歷過。
可採用標記法,結點入棧時,配一個標志tag一同入棧(0:遍歷左子樹前的現場保護,1:遍歷右子樹前的現場保護)。
首先將T和tag(為0)入棧,遍歷左子樹;返回後,修改棧頂tag為1,遍歷右子樹;最後訪問根結點。 [Page]
typedef struct stackElement{
Bitree data;
char tag;
}stackElemType;
【演算法】
void PostOrder(BiTree T, Status ( *Visit ) (ElemType e))
{
InitStack(S);
while ( T!=NULL || !StackEmpty(S) ){
while ( T != NULL ){
Push(S,T,0);
T = T->lchild;
}
while ( !StackEmpty(S) && GetTopTag(S)==1){
Pop(S, T);
Visit(T->data);
}
if ( !StackEmpty(S) ){
SetTopTag(S, 1); // 設置棧頂標記
T = GetTopPointer(S); // 取棧頂保存的指針
T = T->rchild;
}else break;
}
}

⑹ java樹(不是二叉樹) 求最小值

既然涉及到二叉樹了,遞歸就肯定存在了

private Baumknoten deleteMaxValue() {

Baumknoten newRoot; //一個節點

if (this.rightTree == null) { //右子節點 == null

newRoot = this.leftTree; //賦值
} else {

this.rightTree = this.rightTree.deleteMaxValue(); //本節點 = 本節點的右子節點的這個方法(也就是你貼出來的方法)返回的節點。
newRoot = this; //節點賦值
}

return newRoot; //返回節點
}

這就是一個遞歸,或許樹的定義是左子節點比父節點小,右子節點比父節點大,

但有些出路,不能肯定。

遞歸的意思就是在方法內部調用自己,滿足一定條件後跳出,可以理解為循環,

但有些循環是不能實現某些遞歸能實現的功能的。

我給你講解下這個方法的意思吧:

其實這個方法的需求是找出二叉樹中最大的值,並返回。

假設樹的定義是左子節點比父節點小,右子節點比父節點大的常規樹:

進入方法,定義一個節點,然後判斷當前節點的右節點是不是空,如果是空就證

明當前節點是最大值了,返回當前節點就行了(但他返回的是當前節點的左子節

點,詫異!),如果不是空就調用當前節點的右子節點的deleteMaxValue方法

(也就是你貼出來的方法,是自己,這就構成了遞歸),並把右子節點的

deleteMaxValue方法的返回值返回到父節點的方法里,父節點的方法接收返回值

並返回給調用者,進入右子節點的deleteMaxValue方法後,繼續上面的操作,直

到滿足了條件跳出為止,條件就是if (this.rightTree == null)。

典型的遞歸。
請參考

⑺ 用java編寫一個非遞歸的二叉樹的遍歷,急要!!!

import java.util.LinkedList;
import java.util.Stack;

public class MainTest {

public static void scanTree1(Tree root) { //橫向遍歷
LinkedList<Tree> queue = new LinkedList<Tree>();
queue.add(root);
while (!queue.isEmpty()) {
Tree node = queue.poll();
System.out.println(node.getData());
Tree left = node.getLeft();
Tree right = node.getRight();
if (left != null) {
queue.add(left);
}
if (right != null) {
queue.add(right);
}
}
}

public static void scanTree2(Tree root) { //縱向前序
Tree node = root;
Stack<Boolean> stack = new Stack<Boolean>();
boolean leftFlg = false;
while (true) {
System.out.println(node.getData());
if (node.getLeft() != null && leftFlg) {
node = node.getLeft();
stack.add(true);
leftFlg = true;
} else if (node.getRight() != null) {
node = node.getRight();
stack.add(false);
leftFlg = true;
} else if (stack.isEmpty()) {
break;
} else if (stack.pop()) {
node = node.getParent();
leftFlg = false;
}
}
}

public static void scanTree3(Tree root) {//縱向中序
Tree node = root;
Stack<Boolean> stack = new Stack<Boolean>();
boolean leftFlg = false;
while (true) {
if (node.getLeft() != null && leftFlg) {
node = node.getLeft();
stack.add(true);
leftFlg = true;
} else if (node.getRight() != null) {
System.out.println(node.getData());
node = node.getRight();
stack.add(false);
leftFlg = true;
} else if (stack.isEmpty()) {
break;
} else if (stack.pop()) {
node = node.getParent();
leftFlg = false;
}
}
}

public static void scanTree4(Tree root) {//縱向後序
Tree node = root;
Stack<Boolean> stack = new Stack<Boolean>();
boolean leftFlg = false;
while (true) {
if (node.getLeft() != null && leftFlg) {
node = node.getLeft();
stack.add(true);
leftFlg = true;
} else if (node.getRight() != null) {
node = node.getRight();
stack.add(false);
leftFlg = true;
} else if (stack.isEmpty()) {
break;
} else if (stack.pop()) {
System.out.println(node.getData());
node = node.getParent();
leftFlg = false;
}
}
}

public static void main(String[] args) {
Tree root = new Tree();
// TODO
scanTree1(root);
scanTree2(root);
scanTree3(root);
scanTree4(root);
}
}

class Tree {
private Tree left;
private Tree right;
private Tree parent;
private Object data;

public Object getData() {
return data;
}

public void setData(Object data) {
this.data = data;
}

public Tree getLeft() {
return left;
}

public void setLeft(Tree left) {
this.left = left;
}

public Tree getRight() {
return right;
}

public void setRight(Tree right) {
this.right = right;
}

public Tree getParent() {
return parent;
}

public void setParent(Tree parent) {
this.parent = parent;
}
}

⑻ java如何創建一顆二叉樹

計算機科學中,二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作「左子樹」(left
subtree)和「右子樹」(right
subtree)。二叉樹常被用作二叉查找樹和二叉堆或是二叉排序樹。
二叉樹的每個結點至多隻有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2的
i
-1次方個結點;深度為k的二叉樹至多有2^(k)
-1個結點;對任何一棵二叉樹T,如果其終端結點數(即葉子結點數)為n0,度為2的結點數為n2,則n0
=
n2
+
1。
樹是由一個或多個結點組成的有限集合,其中:
⒈必有一個特定的稱為根(ROOT)的結點;
二叉樹
⒉剩下的結點被分成n>=0個互不相交的集合T1、T2、......Tn,而且,
這些集合的每一個又都是樹。樹T1、T2、......Tn被稱作根的子樹(Subtree)。
樹的遞歸定義如下:(1)至少有一個結點(稱為根)(2)其它是互不相交的子樹
1.樹的度——也即是寬度,簡單地說,就是結點的分支數。以組成該樹各結點中最大的度作為該樹的度,如上圖的樹,其度為2;樹中度為零的結點稱為葉結點或終端結點。樹中度不為零的結點稱為分枝結點或非終端結點。除根結點外的分枝結點統稱為內部結點。
2.樹的深度——組成該樹各結點的最大層次。
3.森林——指若干棵互不相交的樹的集合,如上圖,去掉根結點A,其原來的二棵子樹T1、T2、T3的集合{T1,T2,T3}就為森林;
4.有序樹——指樹中同層結點從左到右有次序排列,它們之間的次序不能互換,這樣的樹稱為有序樹,否則稱為無序樹。
樹的表示
樹的表示方法有許多,常用的方法是用括弧:先將根結點放入一對圓括弧中,然後把它的子樹由左至右的順序放入括弧中,而對子樹也採用同樣的方法處理;同層子樹與它的根結點用圓括弧括起來,同層子樹之間用逗號隔開,最後用閉括弧括起來。如右圖可寫成如下形式:
二叉樹
(a(
b(d,e),
c(
f(
,g(h,i)
),
)))

熱點內容
後綴解壓什麼意思 發布:2025-01-13 10:35:17 瀏覽:185
索尼安卓11如何退回安卓10 發布:2025-01-13 10:24:09 瀏覽:127
程序編譯結構 發布:2025-01-13 10:24:08 瀏覽:90
創建郵箱地址伺服器連接錯誤 發布:2025-01-13 09:49:24 瀏覽:723
linux編輯文檔 發布:2025-01-13 09:47:51 瀏覽:435
二手製冷壓縮機 發布:2025-01-13 09:43:59 瀏覽:585
網魚電腦密碼多少 發布:2025-01-13 09:33:46 瀏覽:464
如何取消子賬號密碼 發布:2025-01-13 09:22:41 瀏覽:347
抖音搜索有緩存 發布:2025-01-13 09:17:28 瀏覽:590
c語言字元數組連接 發布:2025-01-13 08:55:11 瀏覽:901