來源:我是碼農,轉載請保留出處和鏈接!
本文鏈接:http://www.54manong.com/?id=1233
題目描述
從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。
void BinaryTreeLevelOrder(BTNode* root) { Queue q; //樹爲空,直接返回 if (root == NULL) { return; } QueueInit(&q); //先將根節點入隊 QueuePush(&q, root); while (QueueEmpty(&q)) { //出隊保存隊頭並訪問 BTNode* front = QueueFront(&q); printf("%c", front->_data); QueuePop(&q); //將出隊結點的左子樹根入隊 if (front->_left) QueuePush(&q, front->_left); //將出隊結點的右子樹根入隊 if (front->_right) QueuePush(&q, front->_right); } }
利用遞歸的方法進行先序遍歷,傳遞深度,遞歸深入一層擴容一層數組,先序遍歷又保證了同層節點按從左到右入數組,十分巧妙!!!
他在不斷地擴容,最後答案類似這樣{{1},{2,3},{4,5,6}}
多傳遞一個當前結點所在層次就可以用前序遍歷實現了,學習了
假如現在元素是[1,2,3],當進入2時會創建一個 arraylist,此時 depth = 2,size=2;當2遍歷完後會進入3,此時3 就不用創建 arraylist 了,因爲 2,3是同一層的,並且此時 depth==size 。這個判斷是用來讓最左的元素創建 arraylist 就行了,而同一層後邊的元素共用這個 arraylist
利用遞歸的方法進行先序遍歷,傳遞深度,遞歸深入一層擴容一層數組,先序遍歷又保證了同層節點按從左到右入數組,十分巧妙!!!
代碼實現如下:
//用遞歸做的 public class Solution { ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> list = new ArrayList<>(); depth(pRoot, 1, list); return list; } private void depth(TreeNode root, int depth, ArrayList<ArrayList<Integer>> list) { if(root == null) return; if(depth > list.size()) list.add(new ArrayList<Integer>()); list.get(depth -1).add(root.val); depth(root.left, depth + 1, list); depth(root.right, depth + 1, list); } }