創建於:2019.5.25
- 方一
思路:
得到一棵二叉樹的 帶有空子樹標識的層序遍歷序列;
從前往后逐個遍歷元素,直到找到 空標識;
看 空標識 后的元素是否全是 空標識,全是空標識 則是完全二叉樹,不全是空標識則是完全二叉樹
問題(待解決):
無法實現 得到帶有空子樹標識的層序遍歷序列 的算法,沒想到如何將空標識加入到list的適當位置
- (網上查的)方二:
思路:
非遞歸層序遍歷的應用:判斷二叉樹是否是完全二叉樹
入隊列的時候不用判斷節點是否為空,直接入隊列;出隊列的時候如果front==NULL,停止入隊列,判斷隊列里的元素是否全為NULL,若是則是完全二叉樹。
問題:
queue.add(null)不合法
* null值不會真的入隊
代碼:
1 public boolean isCompleteBinaryTree() { 2 if(this.root==null) { //空樹是完全二叉樹 3 return true; 4 } 5 6 LinkedQueue<BinaryNode<T>> queue = new LinkedQueue<>();// 空隊列 7 BinaryNode<T> p = this.root; // 根結點不入隊 8 int count = 1;// 已經出隊的元素個數 9 ArrayList preList=this.getPrelist(this.root);//帶空標識的前序序列 10 11 while (p != null) { // 當出隊元素為null時,停止繼續入隊 12 queue.add(p.left);// p的左孩子入隊 13 queue.add(p.right);// p的右孩子入隊 14 15 p = queue.poll(); 16 count++; 17 System.out.println(p); 18 } 19 System.out.println(count); 20 while (count<preList.size()) { 21 p = queue.poll(); 22 count++; 23 if (p != null) 24 return false; 25 } 26 return true; 27 28 }
修改:(已測試)
1 /** 2 * @title: isCompleteBinaryTree 3 * @description: judge a tree is complete tree or not; use que 4 * @author: Navis 5 * @date: May 25, 2019 11:00:31 PM 6 * @return boolean 7 */ 8 public boolean isCompleteBinaryTree() { 9 if (this.root == null) { // 空樹是完全二叉樹 10 return true; 11 } 12 13 LinkedQueue<BinaryNode<T>> queue = new LinkedQueue<>();// 空隊列 14 queue.add(root); // 根結點入隊 15 BinaryNode<T> p = null; 16 17 while (!queue.isEmpty()) { // 隊列不空時 18 p = queue.poll(); 19 if (p.left != null) { 20 queue.add(p.left);// p的左孩子入隊 21 if (p.right != null) { 22 queue.add(p.right);// p的右孩子入隊 23 } else 24 break; 25 } else { 26 if (p.right != null) 27 return false; 28 else 29 break; 30 } 31 } 32 while (!queue.isEmpty()) { 33 p = queue.poll(); 34 if (p.left != null || p.right != null) 35 return false; 36 } 37 return true; 38 }