資料結構 14 二叉樹的層次遍歷與案例分析

2021-10-09 02:50:52 字數 2895 閱讀 6202

層次遍歷就像圖中一樣,從上到下,從左到右的順序遍歷。而要實現這個遍歷的話,我們可以建立乙個迴圈佇列。先將二叉樹的頭結點入佇列。然後出佇列訪問這個結點,如果它有左子樹,就把左子樹的根節點入隊。如果它有右子樹,就把右子樹的根節點入隊。然後出隊,訪問。一直往復至空為止。

//如果右子樹不空,則右子樹的根節點入隊

需求:假設二叉樹採用二叉鍊錶儲存結構儲存,設計乙個演算法,求出該二叉樹的寬度

對於這個需求,我們可以先分別求出每層的結點數,然後我們再從中選出最大的那個。但是如果要達到這個目的,我們首先得要明白兩件事

第一件事呢,就是,對於那種非空的樹,樹根所在的層為第一層,並且從剛才的層次遍歷演算法中我們可以發現,有乙個由當前結點找到向左右孩子結點的操作。這就意味著如果知道當前結點的層號,就可以推出其左右孩子的層號,也就是當前結點層號+1。進而就可以求出所有結點的層號

第二件事就是在層次遍歷中,用到了乙個迴圈佇列。這個佇列的入隊和出隊用到了rear = (rear + 1) % maxsize; 和 front = (front + 1) % maxsize; 兩個操作。假如說這個佇列的陣列容量足夠大,可以容納樹裡面的所有結點。那麼,這個時候在整個遍歷操作中隊頭和隊尾指標就不會出現折回陣列起始位置的情況。那麼剛才那兩行**可以換成++front和++rear。出隊也只是把隊頭後移了一位,但是並沒有把資料刪除。隊頭元素也不會被新入隊的元素覆蓋

新增乙個結構體

typedef

struct

treeno;

需求實現
int

maxnode

(tree *brn)

if(p->right !=

null)}

//結束迴圈的時候,treeno已經儲存了這棵樹的最大層數

max =0;

for(i =

1; i <= treeno; i++)if

(max < n)}}

return max;

}//空樹直接返回 0

由圖可知,二叉樹的寬度的確為4。所以這種演算法是正確的。

#include

#include

#define maxsize 100

typedef

struct binarynode tree;

typedef

struct

treeno;

//賦值

tree*

gettree

(char data)

//前序遍歷

void

preorder

(tree* tree)

}//層次遍歷

void

levelorder

(tree* tree)

//如果右子樹不空,則右子樹的根節點入隊

if(p->right !=

null)}

}printf

("\n");

}int

maxnode

(tree* brn)

if(p->right !=

null)}

//結束迴圈的時候,treeno已經儲存了這棵樹的最大層數

max =0;

for(i =

1; i <= treeno; i++)if

(max < n)}}

return max;

}//空樹直接返回 0

else

}int

main

(int argc,

char

* ar**)

資料結構 二叉樹層次遍歷

1 二叉樹的層次遍歷 2 假設二叉樹採用二叉鏈儲存結構,設計乙個演算法輸出從根節點到每個葉子節點的路徑的逆 即求葉子節點及其所有祖先節點的序列 include include define maxsize 100 typedef char elemtype using namespace std t...

資料結構 二叉樹 廣度遍歷(層次)

力扣題目 102.二叉樹的層序遍歷 107.二叉樹的層次遍歷ii 199.二叉樹的右檢視 637.二叉樹的層平均值 429.n叉樹的層序遍歷 102.二叉樹的層序遍歷 1.用佇列去裝 先入根節點 2.當前層出隊,並把左右節點入隊 3.重複二,直到佇列空 class solution answer.p...

mysql 遍歷二叉樹 資料結構 二叉樹遍歷

這篇博文主要是研究二叉樹遍歷的遞迴與非遞迴演算法,有興趣的小夥伴可以了解下!二叉樹的遞迴遍歷 深度優先遍歷 先來張圖,看看各結點遍歷時的情況 二叉樹深度優先遍歷總結 分別為第一次,第二次,第三次進入某個結點 先序遍歷 先訪問根結點,然後先序遍歷左子樹,最後先序遍歷右子樹 根 左 右 中序遍歷 先中序...