C語言二叉樹中的遞迴呼叫

2021-10-04 14:33:21 字數 1532 閱讀 8606

最近正在學《c primer plus》,對於書中第十七章的二叉查詢樹部分的遞迴呼叫有些困惑,在查詢了相關解釋後,總算是明白了一點,和大家分享一下吧

首先,附上書中的部分**:

//函式呼叫語句為:inorder(ptree -> root, pfun)

//即最先傳入函式的是指向樹根節點的指標,而函式指標pfun指向的是printitem函式

static

void

inorder

(const trnode * root,

void

(*pfun)

(item item))}

void

printitem

(item item)

先解釋一下上面**中的一些表示符的含義:

在解釋此段**之前,我們先假設有如下所示乙個二叉樹:

現在我們再看**:

static

void

inorder

(const trnode * root,

void

(*pfun)

(item item)

)}

首先root指向的是樹根節點,即e節點,遞迴1遞進一次,root指向根節點的左子節點,即b節點;

條件判斷為真,遞迴1再遞進一次,root指向b節點的左子節點,即a節點;

此時a節點後無子節點,root -> left == null,條件判斷為假,遞迴1回歸,root指向a節點,執行遞迴1後面的語句;

函式指標pfun列印a節點的資訊,遞迴2遞進,root -> right == null,條件判斷為假,遞迴2回歸,root指向a節點,遞迴1回歸,root指向b節點,函式指標pfun列印b節點的資訊;

遞迴2遞進一次,root指向b節點的右子節點,即d節點,再遞進一次,root -> right == null,條件判斷為假,遞迴2回歸,root指向d節點,執行遞迴1,root指向d節點的左子節點,即c節點,c節點後無子節點,執行遞迴1後面的語句,列印c節點的資訊;

遞迴1回歸,root指向d節點,列印d節點的資訊,遞迴2回歸,root指向b節點,遞迴1回歸,root指向e節點,列印e節點的資訊,至此左子樹遍歷完;

右子樹的遍歷參照上面的過程,不同的是root指向的節點順序為e -> h -> f -> g -> f -> h -> i -> h -> e,而只有在遞迴1回歸的過程中才能列印節點資訊,所以列印節點資訊的順序為f -> g -> h -> i

我們可以根據上述過程繪製乙個流程圖:

以上就是關於二叉樹中的遞迴呼叫,如果文中有錯誤,還請指正,謝謝!

二叉樹的遞迴呼叫

二叉樹本身就是遞迴定義的,所以在二叉樹上運用遞迴非常方便。下面是我刷的常見關於二叉樹的遞迴演算法的題目 leetcode 104.maximum depth of binary tree 題意 找根結點到葉子結點的最長距離 即最大深度 演算法思路 當結點為null時,返回0,否則返回左右子樹最大距離...

遞迴遍歷二叉樹 C語言

之前寫了關於二叉樹的非遞迴遍歷演算法的 今天把二叉樹的遞迴遍歷演算法的 補上,內容很簡單!但是今天也算是寫了一會兒 了 姑且這麼認為吧 include include typedef struct bitnode bitnode,bitree 二叉樹節點 二叉樹先序遍歷 void prebitree...

二叉樹的非遞迴呼叫

實現過程 首先我們知道中序遍歷就是先訪問左子樹,再根節點,最後右子樹。stl的stack容器滿足我們的先進後出的要求。1.訪問根節點的左孩子節點,看是否為null,如果存在左節點,該節點入棧如果沒有左子樹,那就訪問該節點。2.如果節點有右子樹,則重複1步驟,如果沒有右子樹 節點訪問完畢 回退,讓棧頂...