蛇形列印二叉樹

2021-08-10 08:17:15 字數 1802 閱讀 5670

需求

請實現乙個函式實現蛇形列印二叉樹,即第一行從左到右的順序列印,第二行從右到左順序列印,第三行從左到右…….

上圖二叉樹列印結果為:

8 10 6

5 7 9 11

思路:

按照蛇形列印二叉樹需要兩個棧,在列印某一層節點時,把下一層節點儲存在另乙個棧中,如果列印的是奇數層,則先儲存左子節點,在儲存右子節點,如果是偶數層,則先儲存右子節點再儲存左子節點到另乙個棧中。

棧的資料結構選擇

因為我們要儲存的節點個數未知,所以如果用陣列,則會造成空間的大量浪費,所以要用鍊錶,但是如果用單向鍊錶時,每次出棧都要找到該出棧節點的前驅,所以會造成時間複雜度提高,為了避免這些問題,我選擇了雙向鍊錶。

如圖:

實現

定義棧的節點

typedef

struct sstack;

入棧函式:

void pushstack(stack

**top, btnode *pb)

else

}

出棧函式:

btnode* popstack(stack

**top)

stack

*s =

*top;//獲取出棧元素

btnode *pb = s->pb;//獲取出棧元素所儲存的二叉樹節點位址

*top = (*top)->pa;//棧頂指標下移

if (*top)

free(s);//釋放出棧節點

return pb;//返回出棧元素所儲存大二叉樹節點位址

}

蛇形列印鍊錶函式

void printassnake(btnode *root);//將兩個棧初始化為空

//先將頭結點入棧

pushstack(&(stack[0]), root);

while (stack[0] || stack[1])

if (pb->left)

}else

if (pb->right)

}if (!thiscount)}}

除錯:

//定義二叉樹的節點

typedef struct nodebtnode;

//建立二叉搜尋樹

btnode* creatbinsorttree(int data, int len)

else

else

}if (pa->data

< p->data)

else}}

return root;

}int main(void);

btnode *root = creatbinsorttree(data,7);

printassnake(root);

system("pause");

return 0;

}

除錯結果:

二叉樹列印

舉例 1.初始化時,last 1,把1放入佇列 2.將1出隊,把1的子孩子2,3放入佇列,更新nlast 3 3.nlast更新完之後,列印上一次出隊的1,並和last比較,如果相同就列印換行,並更新last nlast 3 4.將2出隊,把2的子孩子4放入佇列,更新nlast 4 5,nlast更...

二叉樹列印

給定一顆二叉樹的頭節點head,請按照現在大家看到的這種格式列印 要求列印成 12 主要解決的問題是 如何換行 last 表示正在列印的當前行的最右節點 從左至右遍歷,如果遍歷到last節點,說明該換行了,換行之後,只需要nlast last,繼續下一行的列印過程,一直重複,直到所有的節點都列印完。...

列印二叉樹

之前在了解二叉樹旋轉的時候,為了方便檢視中間狀態,就寫了個以樹狀形式列印二叉樹的函式。起初是使用二叉樹中序遍歷的結果展開的方式,簡單但列印出來的樹有一定的傾斜。例如這棵樹 5 3 7 2 6 8它的中序遍歷結果為 2 3 5 6 7 8 列印出來的結果中,節點 3 和節點 7 不是對稱的。因為節點 ...