層序遍歷二叉樹,以及拓展問題,同層同行輸出

2021-06-28 16:38:57 字數 2612 閱讀 2798

一、按層遍歷二叉樹

很好理解,其實就是圖的廣度優先遍歷,偽**如下:

root入隊

while 隊不空

top=出隊

列印top節點的權值

如果top節點有左子樹,將左子樹入隊

如果top節點有右子樹,將右子樹入隊

具體**如下:

void layer(tlink root)

}

二、按層遍歷二叉樹並且同層節點在同一行輸出 如:

對此二叉樹遍歷的結果應該是: 1,

2 , 3

4, 5, 6

7, 8

第一種方法,就是利用遞迴的方法,按層進行列印,我們把根節點當做第0層,之後層次依次增加,如果我們想列印第二層怎麼辦呢,利用遞迴的**如下:

int zigzag2(tlink root,int height)

return zigzag2(root->left,height-1)+zigzag2(root->right,height-1);

}

呼叫函式的**如下:

for(int i=0;i<10;i++)
很明顯。這個程式的效率極其低下。

第二種方法,我們可以設定兩個佇列,想象一下佇列的特點,就是先進先出,首先把第0層儲存在乙個佇列中,然後按節點訪問,並把已經訪問節點的左右孩子節點放在第二個佇列中,當第乙個佇列中的所有節點都訪問完成之後,交換兩個節點。這樣重複下去,知道所有層的節點都被訪問,這樣做的代價就是空間複雜度有點高。

**如下:

void zigzag0(tlink root)

} free(queue1);

free(queue2);

}

第三種方法就是設定雙指標,乙個指向訪問當層開始的節點,乙個指向訪問當層結束節點的下乙個位置:

這是第一層訪問的情況,當訪問第0層之後的結構如下,把第0層的所有子節點加入之後:

訪問完第1層之後:

**如下:

void zigzag1(tlink root)

printf("\n");

}}

測試**如下:

#include #include #include #define fix(function,tree) printf("%s:",#function);function(tree);printf("\n")

#define qcapacity 101

struct queue;

typedef struct queue *qlink;

struct tnode;

typedef struct tnode *tlink;

qlink createqueue(void)

int emptyqueue(qlink queue)

void enqueue(qlink queue,void *item)

void *dequeue(qlink queue)

void prefix(tlink root)

void infix(tlink root)

void suffix(tlink root)

tlink createnode(int vertex)

tlink insertnode(tlink tree,int vertex)

void exchangequeue(qlink queue1,qlink queue2)

void zigzag0(tlink root)

} free(queue1);

free(queue2);

}void zigzag1(tlink root)

printf("\n"); }}

int zigzag2(tlink root,int height)

return zigzag2(root->left,height-1)+zigzag2(root->right,height-1);

}void layer(tlink root)

}int main(int argc,char *argv);

int size=sizeof data/sizeof *data;

tlink tree=createnode(data[0]);

for(int i=1;i

最後列印結果如下:

前三行分別是前序、中序、後序

二叉樹層序遍歷 求二叉樹的層序遍歷

給定乙個二叉樹,返回該二叉樹層序遍歷的結果,從左到右,一層一層地遍歷 例如 給定的二叉樹是,該二叉樹層序遍歷的結果是 3 9,20 15,7 示例1 輸入 返回值 1 2 示例2輸入 返回值 1 2,3 4,5 解題思路 重點是如何把在一層的節點放到一起,設定乙個引數專門放一層的節點 class t...

層序遍歷二叉樹

要求 設計乙個演算法層序遍歷二叉樹 同一層從左到右訪問 我寫了乙個演算法 用乙個佇列儲存被訪問的當前節點的左右孩子以實現層序遍歷。status hierarchybitree bitree t,status visit telemtype e destroyqueue q 釋放佇列空間 return...

二叉樹層序遍歷

主要流程 確定root非空 根指標進佇列 佇列非空就一直迴圈 依次掃瞄目前佇列中所有元素 新增的不算 從佇列取出第一元素 將值放入結果vector中 判斷左右子節點非空,並依次入隊 將本次結果放入二維陣列中 如果需要按層逆序輸出的話,在這裡將二維結果倒排一下 返回二維結果 vector levelo...