一、按層遍歷二叉樹
很好理解,其實就是圖的廣度優先遍歷,偽**如下:
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...