c 實現二叉樹 二叉樹遍歷徹底理解

2021-07-22 04:24:58 字數 2051 閱讀 2741

本來只是乙個複習的,但是為了能系統的理解性複習所以在此花了一段時間來寫這個博文,同時為了貢獻自己的知識,讓那些初學者徹底理解遞迴呼叫,寫了寫自我的理解。一直受那句的影響:只有對乙個知識和技術有足夠的理解後,才能寫出簡單易懂的教程。

1.二叉樹的實現

二叉樹的插入:首先給乙個初始節點,接下來:如果插入的節點比這個節點大,插入到樹的左邊,否則插入到樹的右邊,這是在左右節點為空的情況下。但是此時我們如果左邊有節點怎麼辦,此時如果我們在insert函式中再次呼叫insert函式時,系統會執行進棧操作,系統會把當前的節點壓入棧中,呼叫左孩子或者右孩子的insert函式,所以如果一直有左孩子,會一直執行進棧操作直到沒有判斷的這個節點沒有左孩子為止,這樣就新建乙個節點賦給這個節點的左孩子。二叉樹的遍歷:同插入類似:由於在主函式中初始的那個值作為根節點(那個t,它的值就是1),在遍歷的時候首先判斷它有沒有左孩子,如果有左孩子就一直執行進棧操作,這樣節點的列印操作都無法執行,但是一旦發現節點沒有左孩子,就先執行乙個列印操作,這樣輸出的樹中最左邊孩子節點的值,接著判斷有沒有右孩子如果有,就再次執行進棧操作,這樣如果既沒有左孩子右沒有了右孩子就執行退棧操作。同時為了能使節點資料能用於比計較(可以想象成節點泛型資料是數值型資料集合)需要使資料型別繼承icomparable介面(其實數值型資料能直接比較大小就是繼承了這個介面)。

using system;

public class treewhere titem : icomparable//繼承的這個介面用於通用比較

public void insert(titem newitem) //樹的插入操作實現二叉排序樹

else

}else

else}}

//以下執行左中右的遍歷方式

public void walktree() //樹的遍歷

console.writeline(this.nodedata.tostring());

if (this.righttree != null)

}private titem nodedata; //節點

private treelefttree; //左孩子

private treerighttree; //右孩子

}class test

}

2.二叉樹遍歷的理解如果對於上述遍歷仍然不清楚可以看看下面對於二叉樹的遍歷理解

要想徹底的理解遞迴就必須對程式呼叫子程式的過程有所了解,也就是系統對程式點的壓棧和出棧操作,在主程式呼叫子程式的時候,系統是將子程式的入口點做壓棧操作,在呼叫完子程式後,系統執行退棧操作,繼續從主程式的位置往下執行。如果子程式中還有子程式,就會多次執行壓棧和退棧操作。如圖左邊是二叉樹,右邊是遍歷**。

首先判斷根節點a的左子樹是否為空,因為a有左子樹所以執行**1,這是相當於執行子程式了,系統為了保證程式能正常執行,需要現將1位置處的斷點壓棧,為的就是在執行完子程式後能讓主程式繼續執行,所以:我們可以想象系統在執行節點a時將**1位置的斷點壓棧(我們在這裡為了簡單就說將a壓棧),接著執行節點a的左子樹b的遍歷,由於節點b還是有左子樹,所以繼續將b壓棧,由於d沒有左子樹,所以執行d層中的列印語句(也就是**2),接著判斷d有沒有右子樹,發現d沒有右子樹,於是系統開始出棧操作,這時的棧中有那些斷點呢

棧:a b

b出棧,斷點出棧後,程式是從斷點的下一條指令開始執行,因為if語句中沒有指令了,於是就從2開始執行,呼叫列印b的操作,接著由於b有右子樹,所以開始執行3,此時再次將b層的這個斷點壓棧,去執行e層的**,由於e沒有左子樹所以執行列印e的操作,同時e沒有右孩子,所以退棧到b層,但是b層的下一條指令沒有了,於是b層執行完了跳出b層回到a層,此時棧中儲存的是a層的1處的斷點,所以繼續上面的思路執行a層的**2列印a,接著由於a有右孩子,於是c進棧,和前面的思路一樣,列印完f,退回到c層列印c,最後列印g,在g層執行完後退回到c層3處,同樣c層沒有可執行的**跳出c層,繼續退回到a層3出,a層3處的下一條指令也沒有了,於是a層執行完跳出,至此棧中也空程式執行完畢。

構建二叉樹 遍歷二叉樹

陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...

二叉樹遍歷理解

口訣 前序遍歷 根結點 左子樹 右子樹 中序遍歷 左子樹 根結點 右子樹 後序遍歷 左子樹 右子樹 根結點 層次遍歷 僅僅需按層次遍歷就可以 二叉樹的遍歷,是從左到右的,前 中 後這三個字代表著根結點的位置 其實也是最終根結點的位置 再次看到前序遍歷,前 就代表根結點在前,然後從左到右,就是 根結點...

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...