判斷一棵二叉樹是否為BST,一棵樹是否為完全二叉樹


對於一顆搜索二叉樹,最簡單的方法就是用中序遍歷,看是不是一個遞增數列,如果是則是一顆搜索二叉樹,如果不是則不是搜索二叉樹。在這里用一個lastVisit去記錄上一次搜索到的節點。整個過程就是先找到最左下角的節點,更新這個lastVisit為這個節點的值,然后按照中序遍歷依次更新即可。代碼如下。

 1 #include <stdio.h>
 2 #include <climits>
 3 
 4 //二叉樹結點
 5 typedef struct binary_tree_node_t{
 6     binary_tree_node_t * left;
 7     binary_tree_node_t * right;
 8     int  elem;
 9 
10 };
11 
12 //如果是BST, 其中序遍歷應該是從小到大的順序
13 int lastVisit = INT_MIN;
14 
15 int judge_BST(binary_tree_node_t * root){
16     if(root == NULL){
17         return 1;
18     }
19 
20     int judgeLeft = judge_BST(root->left);//先判斷左子樹
21 
22     if( (root->elem >= lastVisit) && judgeLeft == 1){//當前結點比上次訪問的數值要大
23         lastVisit = root->elem;
24     }else{
25         return 0;
26     }
27 
28     int judgeRight = judge_BST(root->right);//最后右子樹
29 
30     return judgeRight;
31 
32 }
33 
34 
35 //判斷一顆二叉樹是不是二叉排序樹
36 int main(){
37     binary_tree_node_t ns[10];
38 
39     for(int i = 1; i <= 6; i++){
40         binary_tree_node_t tmp;    
41         tmp.elem  = i;
42         tmp.left = NULL;//必須顯式初始化為NULL
43         tmp.right = NULL;
44         ns[i] = tmp;
45     }
46     
47     binary_tree_node_t root;
48     root.elem = 4;
49 
50     root.left = &ns[2];
51     root.right = &ns[5];
52 
53     ns[2].left = &ns[1];
54     ns[2].right = &ns[3];
55      
56     ns[5].right = &ns[6];
57 
58 
59     printf("%d\n", judge_BST(&root));
60 
61     return 0;
62 }

對於一顆完全二叉樹采用廣度優先遍歷,從根節點開始,入隊列,如果隊列不為空,循環。遇到第一個沒有左兒子或者右兒子的節點,設置標志位,如果之后再遇到有左/右兒子的節點,那么這不是一顆完全二叉樹。這個方法需要遍歷整棵樹,復雜度為O(N),N為節點的總數。

 1     //二叉樹結點定義  
 2     typedef struct Node  
 3     {  
 4         int data;  
 5         struct Node* left;  
 6         struct Node* right;  
 7     }Node;  
 8       
 9     //實現廣度遍歷需要隊列  
10     Queue<Node*> queue;  
11       
12     //第n層最右節點標志  
13     bool leftMost = false;  
14       
15     bool ProcessChild(Node* child)  
16     {  
17         if (child)  
18         {  
19             if (!leftMost)  
20             {  
21                 queue.push(child);  
22             }  
23             else  
24             {  
25                 return false;  
26             }  
27         }  
28         else  
29         {  
30             leftMost = true;  
31         }  
32       
33         return true;  
34     }  
35       
36     bool IsCompleteBinaryTree(Node* root)  
37     {  
38         //空樹也是完全二叉樹  
39         if (!root)  
40             return true;  
41       
42         //首先根節點入隊列  
43         queue.push(root);  
44       
45         while(!queue.empty())  
46         {  
47             Node* node = queue.pop();  
48       
49             //處理左節點  
50             if (!ProcessChild(node->left))  
51                 return false;  
52       
53             //處理右節點  
54             if (!ProcessChild(node->right))  
55                 return false;  
56         }  
57       
58         //廣度優先遍歷完畢,此乃完全二叉樹  
59         return true;  
60     }  

 


免責聲明!

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



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