二叉樹
資料結構:資料域+左子節點指標+右子節點指標
遍歷:前序遍歷,中序遍歷,後續遍歷(使用遞迴,結束條件為根節點為空,只是遞迴的順序不同)
層次遍歷:分層遍歷二叉樹(按層次從上到下,從左到右)迭代,相當於廣度優先搜尋,使用佇列實現。佇列初始化,將根節點壓入佇列。當佇列不為空,進行如下操作:彈出一個節點,訪問,若左子節點或右子節點不為空,將其壓入佇列。
常見演算法(主要演算法都是遞迴):
(1)求二叉樹的節點個數(遞迴)
如果二叉樹不為空,二叉樹節點個數 = 左子樹節點個數 + 右子樹節點個數 + 1
(2)求二叉樹的深度(高度)(遞迴)
如果二叉樹不為空,二叉樹的深度 = max(左子樹深度, 右子樹深度) + 1
3. 求二叉樹第k層的節點個數(遞迴)
求以root為根的k層節點數目,等價於求以root左孩子為根的k-1層(因為少了root)節點數目 加上以root右孩子為根的k-1層(因為 少了root)節點數目。
4.求二叉樹中葉子節點的個數(遞迴)
如果二叉樹為空,返回0
如果二叉樹是葉子節點,返回1
如果二叉樹不是葉子節點,二叉樹的葉子節點數 = 左子樹葉子節點數 + 右子樹葉子節點數
佇列
1.用兩個棧實現一個佇列,並分別實現在佇列尾部插入結點和在頭部刪除結點的功能。
將幾個元素壓入其中一個棧的時候,的確是"先進後出",但是可以將這些元素再壓入另一個棧,這樣就可以將最後一個元素,也就是先壓入的元素放在棧頂,也就是"先進先出"了。
Stack<string > stack = new Stack<string>();
入棧:stack.push()。 出棧:stack.pop(),經常使用輔助棧