需求
請實現乙個函式實現蛇形列印二叉樹,即第一行從左到右的順序列印,第二行從右到左順序列印,第三行從左到右…….
上圖二叉樹列印結果為:
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 不是對稱的。因為節點 ...