【數據結構——二叉樹】判斷二叉樹是否為完全二叉樹


創建於: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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM